R 正在删除带有data.table的字符串的一部分

R 正在删除带有data.table的字符串的一部分,r,R,我有一个数据表,其中有一些字符串,在这里我找到了重复的东西,我只需要识别某些行。首先我想用它来标识某些行(并基于它创建一个新变量),然后我想去掉示例中的部分(x) 我知道有些解决方案不使用data.table。 然而,问题是我需要更好地学习data.table,我需要%chin%的增强时间性能,这就是为什么我喜欢学习以data.table的方式设置它 c <- c("a", "b (x)", "c", "d (x)") d <- c(1, 2, 3, 4) c_name <-

我有一个数据表,其中有一些字符串,在这里我找到了重复的东西,我只需要识别某些行。首先我想用它来标识某些行(并基于它创建一个新变量),然后我想去掉示例中的部分(x)

我知道有些解决方案不使用data.table。 然而,问题是我需要更好地学习data.table,我需要%chin%的增强时间性能,这就是为什么我喜欢学习以data.table的方式设置它

c <- c("a", "b (x)", "c", "d (x)")
d <- c(1, 2, 3, 4)

c_name <- "string"
d_name <- "numeric"

df <- data.frame(c,d)
names(df) <- c(c_name,d_name)
setDT(df)

#Now comes the part where I want to create a new variable "Newvar" that only has text, if no "(x)" is in (%chin%) the string variable c:
df[ !( c %chin% c("(x)")) , Newvar:="had (x)"]
#My code does not work. It just takes All Rows. 

#Next I want to remove all parts with (x) in string var c:
df[ ( c %chin% c("(x)")) , c ]
#this does not work like this. 

c
%chin%
对完整字符串进行精确匹配,就像%
中的
%一样,但速度更快。您正试图将其用于字符串内的部分匹配。要匹配字符串中的模式,请使用
grep
(或
grepl
,它返回一个
逻辑
,适用于这种情况)

如果您切换到使用
grepl
,我认为您的代码将按预期工作。我使用
fixed=TRUE
,因为我们匹配的是一个精确的模式,而不是正则表达式

我还觉得奇怪的是,你特意将
c
命名为“string”
,但你总是使用
c
,向量,而不是
df$string
,数据表中的列。我建议修改为

# old
df[ !( c %chin% c("(x)")) , Newvar:="had (x)"]
# new: use `grepl` instead of `%chin%`, and `string` instead of `c`
df[ !grepl("(x)", string, fixed = TRUE) , Newvar:="had (x)"]

很好地再现了这个示例,但不要在堆栈溢出上发布类似于
rm(list=ls())
的代码。我不想从你的问题中复制/粘贴代码并意外地运行那一行。哦,对不起,我将删除它!对不起,我不知道!亲爱的格雷戈,谢谢你。我不知道为什么后来我用c来代替字符串,为了清晰起见我引入了c,但并没有完全做到。显然,忽略(!)也被误用了,因为我显然想要那些有“x”这个词的。fixed具体做什么?在帮助中,它是“逻辑的。如果为TRUE,则模式是一个要按原样匹配的字符串。覆盖所有冲突的参数。”但这意味着什么呢?
grepl
,默认情况下,使用正则表达式。正则表达式是一种强大的模式匹配方法,它包含许多特殊字符,包括括号。这里不需要正则表达式,
fixed=TRUE
禁用正则表达式,表示要匹配固定子字符串,而不是模式。感谢@Gregor的解释!
c
# [1] "a"     "b (x)" "c"     "d (x)"
c %chin% "(x)"
# [1] FALSE FALSE FALSE FALSE
grepl("(x)", c, fixed = TRUE)
# [1] FALSE  TRUE FALSE  TRUE
# old
df[ !( c %chin% c("(x)")) , Newvar:="had (x)"]
# new: use `grepl` instead of `%chin%`, and `string` instead of `c`
df[ !grepl("(x)", string, fixed = TRUE) , Newvar:="had (x)"]