2016-01-09 259 views
0

如何使用另一個數據框中的值對另一個數據框中的缺失值進行分組?用R中另一個數據框的值填充缺失值(NAs)

比方說,我有兩個數據集:

數據集1顯示了一個國家每天生產的食物量。

country   day  tonnes of food 
## 1  china 1   6 
## 2  china 1   NA 
## 3  china 2   2 
## 4  china 2   NA 

dataset2是食物的一天

country   day  average tonnes of food 
## 1  china 1   6 
## 3  china 2   2 

平均量如何能填補在NAS數據集1與來自dataset2的平均值。

I.e. IF is.na(dataset1$tonnes)爲真,那麼,平均一日從dataset2$averagetonnes

+0

只是'合併(df1,df2)[ - 3]' –

+0

'-3'做了什麼? – user3200293

+0

刪除合併中的第三列(原始數據中舊的第三列)。看看'merge(df1,df2)'。我認爲'setNames(merge(df1,df2)[ - 3],names(df1))'是最接近你想要的。 –

回答

1

填寫我們可以使用加入data.table

library(data.table) 
setDT(df1)[df2, on =c("country", "day")][is.na(tonnes.of.food), 
    tonnes.of.food:= average.tonnes.of.food][, average.tonnes.of.food:=NULL][] 
# country day tonnes.of.food 
#1: china 1    6 
#2: china 1    6 
#3: china 2    2 
#4: china 2    2 
+0

你知道使用base,reshape或plyr的答案嗎?我不熟悉data.table。 – user3200293

+0

@ user3200293它已發表在評論由RichardScriven – akrun

+0

這並不能給出預期的結果。除非我正確地使用合併,而不是填寫NA,它只是將每個數據集的列綁定在一起。 – user3200293

0

如果我理解你使用正確的match功能將解決您的問題。 數據:

df1 <- data.frame(country=c(rep('china1',2),rep('china2',2)),day=c(1,1,2,2),tof = c(6,NA,2,NA),stringsAsFactors = F) 
df2 <- data.frame(country=c('china1','china2'),day=c(1,2),atof = c(6,2),stringsAsFactors = F) 
df1 
    country day tof 
#1 china1 1 6 
#2 china1 1 NA 
#3 china2 2 2 
#4 china2 2 NA 

這條線將與第二data.frame DF2的相應國家的平均值替換的NaS。 match函數產生匹配位置向量,[which(is.na(df1$tof))]選擇「tof」列中存在NA的索引。

df1$tof[is.na(df1$tof)] <- df2$atof[match(df1$country,df2$country)][which(is.na(df1$tof))] 
df1 
    country day tof 
#1 china1 1 6 
#2 china1 1 6 
#3 china2 2 2 
#4 china2 2 2