我有一个包含一些字符串的数据表,在这里我只需要识别某些行的重复内容即可。首先,我想用它来标识某些行(并基于它创建一个新变量。比起在我的示例中要剥离该部分(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.
我没有收到任何错误消息,但是我的最终数据集应如下所示:
#Final data set generation:
# 1) manually searching for (x)
Newvar <- c("", "had (x)","", "had (x)" )
# 2) "renaming" the string variable c
df$string <- gsub("\\(x\\)*", "", df$string)
#so actually the solution should be:
df$string <- c("a", "b", "c", "d")
但是,在我的实际问题上,我无法在一生中手动编写任何东西:D
答案 0 :(得分:2)
%chin%
可以完全匹配完整的字符串,就像%in%
一样,但是速度更快。您正在尝试像在字符串中进行部分匹配一样使用它。要在字符串中 中匹配模式,请使用grep
(或grepl
,它返回一个logical
,在这种情况下非常有用)。
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
如果您切换为使用grepl
,我认为您的代码将按预期工作。我使用fixed = TRUE
是因为我们匹配的是精确模式,而不是正则表达式。
我也感到奇怪的是,您竭尽全力为c
列命名为"string"
,但是您总是使用c
(即向量),而不是df$string
,data.table
中的列。我建议将其修改为
# 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)"]