我想知道一个元素是否出现在一个数据框的一个组中,然后在该组中的每一行标记为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")
答案 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")