查找值是否出现在一组数据框中的快速方法

Fast way to find if a value occurs within a group of a data frame

我想找出一个元素是否出现在数据框的一组中,然后将组中的每一行标记为如果出现则标记为 1,如果不出现则标记为 0。

例如,假设我对值 1 是否出现在一个组中感兴趣。

df1 = data.frame(group = c(1,1,1,1,2,2,2,2,2,3,3,3),value = c(1,4,3,2,2,1,1,4,2,2,6,2))

> df1
   group value
       1     1
       1     4
       1     3
       1     2
       2     2
       2     1
       2     1
       2     4
       2     2
       3     2
       3     6
       3     2

然后,我想创建一个新列来指定值 1 是否出现在该组的任何位置。

它应该是这样的:

> df1
   group value hasValue
1      1     1        yes
2      1     4        yes
3      1     3        yes
4      1     2        yes
5      2     2        yes
6      2     1        yes
7      2     1        yes
8      2     4        yes
9      2     2        yes
10     3     2        no
11     3     6        no
12     3     2        no

请注意,第 1 组和第 2 组中的每一行的值为 "yes",因为该组中出现了 1,而第 3 组中的每一行都有一个 "no",因为 1 从未出现在第 3 组。

我使用某种科学怪人解决方案解决了这个问题,但我希望使用 dplyr 或 data.table.

会有更快的解决方案
x = dcast(df,group~value,value.var = "value")
vec = NULL
for(i in 1:nrow(x)){
  if(x$`1`[i] > 0){
    vec = c(vec,x$group[i])
  }
}
df$hasValue = ifelse(df$group %in% vec,"yes","no")

您可以使用 ave 函数关闭

ave(df1$value, df1$group, FUN = function(x){1 %in% x})

然后您可以使用 ifelse 将其转换为 "yes",如果您坚持使用 "no"。

df1$hasValue <- ifelse(ave(df1$value, df1$group, FUN = function(x){1 %in% x}), "yes", "no")