2017-07-05 50 views
1

如何基於另一列僅對具有特定列中的值的行進行子集複製。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 

感謝。

+1

如果您可以選擇多行,該怎麼辦?規則是什麼? – www

+0

在列B中同時選擇兩個值。 –

回答

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 
4

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 
+0

'ave()'方法會讓我抓到我癢的地方。 –

+0

@richscriven - 我希望這是一件好事! ;-) – thelatemail

+0

哈哈,當然!這也是一個Seinfeld參考:) –

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