2015-10-22 27 views
-1

我有一個數據集,我正在清理並具有我想合併的某些行(觀察值)。最好的方式來解釋什麼,我要做的是用下面的例子:從每個變量(列)中刪除NAs併合併案例

df<-data.frame(fruits=c("banana","banana","pineapple","kiwi"),cost=c(1,NA,2,3),weight=c(NA,1,2,3),stringsAsFactors = F) 
df 

cost<-df[,1:2] 
weight<-df[,c(1,3)] 

cost 
weight 

cost<-cost[complete.cases(cost),] 
weight<-weight[complete.cases(weight),] 

key<-data.frame(fruits=unique(df[,1])) 
key 

mydata<-merge(key,cost,by="fruits",all.x = T) 
mydata<-merge(mydata,weight,by="fruits",all.x = T) 

mydata 

在前面的例子中,我想保持從香蕉兩個變量(成本和重量)的信息,但不幸的是在不同的記錄。我能夠爲一個變量手動完成,但我的實際數據集有幾十個變量。我想知道如何完成上面完成的任務,但使用dplyr或應用於一組列。

+0

的問題需要多一點的數據 - 我們可以假定成本始終對每個項目一樣嗎?我們可以假設成本和重量總是相同的嗎?你的原始數據看起來像DF還是像成本和重量? – jeremycg

+0

看到你在這裏做什麼真的很麻煩,因爲你堅持要覆蓋你創建的每一個對象。 – Frank

回答

2

我們也可以使用組合dplyr + tidyr

library(dplyr) 
library(tidyr) 

df %>% 
    gather(key, value, -fruits) %>% 
    group_by(fruits) %>% 
    na.omit() %>% 
    spread(key, value) 
## Source: local data frame [3 x 3] 

##  fruits cost weight 
##  (chr) (dbl) (dbl) 
## 1 banana  1  1 
## 2  kiwi  3  3 
## 3 pineapple  2  2 

編輯

你可能要檢查@Frank解決方案,它是短,使用dplyr只:

df %>% 
    group_by(fruits) %>% 
    summarise_each(funs(na.omit)) 
+1

或只是'df%>%group_by(fruits)%>%summarise_each(funs(na.omit))'? – Frank

+1

@Frank謝謝,我認爲使用你的方法會更好。 – dickoa

+0

@Frank我會說你的aporoach看起來很熟悉:) –

2

使用data.table我會像

library(data.table) 
setDT(df)[, lapply(.SD, function(x) x[!is.na(x)]), by = fruits] 
#  fruits cost weight 
# 1: banana 1  1 
# 2: pineapple 2  2 
# 3:  kiwi 3  3 

一個清潔的,但可能更慢的辦法是

setDT(df)[, lapply(.SD, na.omit), by = fruits] 
#  fruits cost weight 
# 1: banana 1  1 
# 2: pineapple 2  2 
# 3:  kiwi 3  3 
+0

我很確定這是重複的。 – akrun