如何在基于另一列的重复项中仅对具有特定列中的值的行进行子集化。
示例:
df
A B C D
1 NA 8 7
1 5 8 9
2 6 5 8
2 NA 5 6
3 NA 8 5
所以在上面的数据集中,前4行是基于A和C列的重复,所以在其中,我只想选择B列中有值的行。
期望的输出,
A B C D
1 5 8 9
2 6 5 8
3 NA 8 5
感谢。
答案 0 :(得分:4)
set hidden3d offset 0
上的前后复制而不是丢失;或不重复:
B
或者使用anydup <- duplicated(df[c("A","C")]) | duplicated(df[c("A","C")], fromLast=TRUE)
df[(anydup & (!is.na(df$B))) | (!anydup),]
# A B C D
#2 1 5 8 9
#3 2 6 5 8
#5 3 NA 8 5
根据@ HubertL的dplyr答案检查每组的长度:
ave
答案 1 :(得分:4)
使用dplyr:
df <- read.table(text="A B C D
1 NA 8 7
1 5 8 9
2 6 5 8
2 NA 5 6
3 NA 8 5", header=T)
df %>%
group_by(A,C) %>%
filter(n()==1|!is.na(B))
A B C D
<int> <int> <int> <int>
1 1 5 8 9
2 2 6 5 8
3 3 NA 8 5
答案 2 :(得分:2)
以下是data.table
library(data.table)
setDT(df)[df[, .I[.N==1 | complete.cases(B)] , .(A, C)]$V1]
# A B C D
#1: 1 5 8 9
#2: 2 6 5 8
#3: 3 NA 8 5