使用data.table删除字符串的一部分

时间:2019-07-15 15:13:11

标签: 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 <- "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

1 个答案:

答案 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$stringdata.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)"]