我们说我有以下数据集
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
答案 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