如何基於另一列僅對具有特定列中的值的行進行子集複製。r - 使用數據框中的值重複數據行
實施例:
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
感謝。
如何基於另一列僅對具有特定列中的值的行進行子集複製。r - 使用數據框中的值重複數據行
實施例:
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
感謝。
使用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
在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
或者使用ave
檢查每組長度爲每@ HubertL的dplyr回答:
df[!is.na(df$B) | ave(df$B, df[c("A","C")], FUN=length)==1,]
# A B C D
#2 1 5 8 9
#3 2 6 5 8
#5 3 NA 8 5
'ave()'方法會讓我抓到我癢的地方。 –
@richscriven - 我希望這是一件好事! ;-) – thelatemail
哈哈,當然!這也是一個Seinfeld參考:) –
這裏是一個選項與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
如果您可以選擇多行,該怎麼辦?規則是什麼? – www
在列B中同時選擇兩個值。 –