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

时间:2015-07-31 16:54:53

标签: r data-manipulation

我想知道一个元素是否出现在一个数据框的一个组中,然后在该组中的每一行标记为1,如果它出现,则为0,如果没有,则为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中的每一行的值都为"是"因为在该组中发生了1,而在组3中的每一行都有一个" no"因为1永远不会出现在第3组中。

我使用某种frankenstein解决方案解决了这个问题,但我希望使用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")

1 个答案:

答案 0 :(得分:1)

您可以使用ave功能

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

然后你可以使用ifelse来转换为“是”,如果坚持的话,则为“否”。

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