查找值是否出现在一组数据框中的快速方法
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")
我想找出一个元素是否出现在数据框的一组中,然后将组中的每一行标记为如果出现则标记为 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")