使用" Grep"功能与数字或重复

时间:2017-12-12 03:11:19

标签: r grep

我们说我有以下数据集

df<- data.frame(id = c(1,2,3), value = c("albert, collin, albert", "albert, albert, albert", "albert, nicole"))

  id  value
  1 albert, collin, albert
  2 albert, albert, albert
  3         albert, nicole

我可以选择两个 albert 的行吗?

我可以使用grep和R中的重复次数,所以我可以输出这个值吗?

 id  value
 1 albert, collin, albert

3 个答案:

答案 0 :(得分:2)

不是regex方法,但您可以尝试。

df[sapply(strsplit(as.character(df$value), ","), function(x) 
                                     sum(grepl("albert", x))) == 2, ]


#  id                  value
#1  1 albert, collin, albert

在这里,我们将value列拆分为,并计算每行中“albert”的出现次数,并仅记录其中包含2个“albert”的行。

此外,您还可以将其包装在函数中,并将2作为不同值的参数传递。

答案 1 :(得分:1)

与@RonakShah略有不同

nRep <- 2;
df[sapply(strsplit(as.character(df$value), ", "), function(x) any(table(x) == nRep)), ];
#  id                  value
#2  2 albert, albert, albert

您可以使用nRep设置重复次数。如果您希望nRep作为下限,即至少(或多于)2次重复,请使用table(x) >= nRep

答案 2 :(得分:1)

基本R函数gregexpr将找到给定模式的多个不相交匹配。您可以使用该列为数据添加count列,并在计数中添加子集。

df$count_matches = sapply(X=gregexpr("albert", df$value), FUN=length)
df
#   id                  value count_matches
# 1  1 albert, collin, albert             2
# 2  2 albert, albert, albert             3
# 3  3         albert, nicole             1

df[df$count_matches == 2, ]
#   id                  value count_matches
# 1  1 albert, collin, albert             2