我有一个这样的数据框:
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已经输出答案 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))]