每个子组数据帧的每列非零

时间:2018-03-06 10:59:32

标签: r

我有一个这样的数据框:

ID<-c(rep("A", times=6), rep("B", times=5), rep("c", times=4))
V1<-c(1,2,3,0, 0,6, 1, 2, 3, 0,0, 1, 0,0,0)
V2<-c(1,2,0,0, 0,6, 1, 2, 0, 0,0, 1, 3,0,0)
V3<-c(1,2,0,0, 0,6, 1, 2, 3, 0,0, 1, 3,5,0)
df<-data.frame(ID,V1, V2, V3)

我想返回列号,ID或数据框,其中每个子组!=0中的非零数字A, B, C至少为3 在示例中

   ID V3
1   A  1
2   A  2
3   A  0
4   A  0
5   A  0
6   A  6
7   B  1
8   B  2
9   B  3
10  B  0
11  B  0
12  c  1
13  c  3
14  c  5
15  c  0

我知道如何使用

计算!=0
apply(df, 2, function(c)sum(c!=0))

由于子组C,V1已经输出,因为子组B和C

,V2已经输出

2 个答案:

答案 0 :(得分:1)

这是基于R的想法,

df[Reduce(`+`, lapply(split(df, df$ID), function(i) colSums(i != 0) >= 3)) == (length(unique(df$ID)))]

给出,

   ID V3
1   A  1
2   A  2
3   A  0
4   A  0
5   A  0
6   A  6
7   B  1
8   B  2
9   B  3
10  B  0
11  B  0
12  c  1
13  c  3
14  c  5
15  c  0

答案 1 :(得分:0)

我们可以使用tidyverse

执行此操作
library(dplyr)
library(magrittr)
df %>% 
   group_by(ID) %>% 
   summarise_all(funs(sum(.!=0)==3))  %>% 
   summarise_at(vars(V1:V3), funs(all)) %>%
   unlist %>%
   c(TRUE, .) %>%
   extract(df, .)
#   ID V3
#1   A  1
#2   A  2
#3   A  0
#4   A  0
#5   A  0
#6   A  6
#7   B  1
#8   B  2
#9   B  3
#10  B  0
#11  B  0
#12  c  1
#13  c  3
#14  c  5
#15  c  0

或者我们可以使用base R

df[c(TRUE, !colSums(!rowsum(+(df[-1]!=0), group= df$ID) == 3))]