2015-10-09 56 views
1

我想知道一種方法來刪除R中的表中重複的值。問題是,我有重複的行與NA和一些沒有。我想最好是只保留包含1)沒有NA或2)可能的NA數量較少的行。下面是一個簡單的數據幀:R:有條件刪除重複的行之間保持一個與較少NA

mat.test=matrix(c(NA,NA,2,NA,NA,NA,NA,3,1,2,2,2,NA,2,3,1,2,4),byrow = T, 6,3) 
colnames(mat.test)=c("MBL","MBW","MBD") 
df=as.data.frame(mat.test) 
df$BAND=c("JP3540","JP3540","JP3540","JP1500","JP2500","JP2500") 
df$Date=c("2012-07-23","2012-07-22","2012-07-24","2011-09-03","2011-09-01","2011-09-02") 
df 

#MBL MBW MBD BAND  Date 
#1 NA NA 2 JP3540 2012-07-23 
#2 NA NA NA JP3540 2012-07-22 
#3 NA 3 1 JP3540 2012-07-24 
#4 2 2 2 JP1500 2011-09-03 
#5 NA 2 3 JP2500 2011-09-01 
#6 1 2 4 JP2500 2011-09-02 

我想是因爲我想保持第一複製值最好是我的數據按日期排序:

z <- df[order(df$Date, decreasing=F),] 

我知道,對於這種規模的數據集,我可以手工刪除它們。但我想讓它自動化。這是我想要的最終輸出。

# MBL MBW MBD BAND  Date 
#6 1 2 4 JP2500 2011-09-02 
#4 2 2 2 JP1500 2011-09-03 
#3 NA 3 1 JP3540 2012-07-24 

希望你能幫助我!謝謝。

回答

1

我們split數據集由'BAND'創建list數據集,得到前三列最大非NA元素的位置,數據集的子集和它的子集。

res <- do.call(rbind,lapply(split(df, df$BAND), 
     function(x) x[which.max(rowSums(!is.na(x[1:3]))),])) 
row.names(res) <- NULL 
res 
# MBL MBW MBD BAND  Date 
#1 2 2 2 JP1500 2011-09-03 
#2 1 2 4 JP2500 2011-09-02 
#3 NA 3 1 JP3540 2012-07-24 
0

檢查na.omit(your data frame)