2015-09-13 56 views
1

我需要將包含每個國家/地區的平均值的列結果從一個數據框(df)附加到另一個包含國家(df1)的數據框。如果有些國家沒有出現在彙總表格中,而我應該得到一個空單元格。 這裏是我創建每個國家的平均第一數據幀的代碼:如何從一個數據框將分組結果附加到另一個數據框

df <- read.table(text = "target birds wolfs  Country 
           3  9   7 a 
           3  8   4 b 
           1  2   8 c 
           1  2   3 a 
           1  8   3 a 
           6  1   2 a 
           6  7   1 b 
           6  1   5 c ",header = TRUE) 
dfCountries<-summaryBy(wolfs ~ Country , data = df, FUN = mean) 

dfCountries 
    Country wolfs.mean 
1  a  3.75 
2  b  2.50 
3  c  6.50 

現在我想追加一個新列新的數據幀上每個國家的結果:我Append_Country.How可以做它?

這裏是DF1數據:

df1<-read.table(text = "  target birds wolfs  Country 
            6  4   5  a  
            4  5   3  a  
            3  8   2  a  
            1  6   4  b  
            3  5   1  a  
            2  2   1  b  
            9  9   4  b  
            8  9   5  f  
            2  3   1  f  ",header = TRUE) 

這是我希望得到的輸出:

df1 
          target birds wolfs  Country Append_Country 
           6  4   5  a   3.75 
           4  5   3  a   3.75 
           3  8   2  a   3.75 
           1  6   4  b   2.50 
           3  5   1  a   3.75 
           2  2   1  b   2.50 
           9  9   4  b   2.50 
           8  9   5  f  
           2  3   1  f  
+0

標籤[tag:dataframes]不應該用於R data.frames。 – Frank

回答

2

您可以嘗試使用merge()與選項all=TRUE

df3 <- merge(df1,df2, by="Country", all=TRUE) 
#> df3 
# Country target birds wolfs Append_Country 
#1  a  4  5  3   3.75 
#2  a  3  8  2   3.75 
#3  a  6  4  5   3.75 
#4  a  3  5  1   3.75 
#5  b  2  2  1   2.50 
#6  b  9  9  4   2.50 
#7  b  1  6  4   2.50 
#8  f  2  3  1    NA 
#9  f  8  9  5    NA 
#10  c  NA NA NA   6.50 

如果你不喜歡NA條目,你可以代表用空字符串花邊它們:

df3[is.na(df3)] <- "" 

我們可以而且重新排序列順序根據所期望的輸出以獲得結果:

df3 <- df3[, c(2,3,4,1,5)] 

#> df3 
# target birds wolfs Country Append_Country 
#1  4  5  3  a   3.75 
#2  3  8  2  a   3.75 
#3  6  4  5  a   3.75 
#4  3  5  1  a   3.75 
#5  2  2  1  b   2.5 
#6  9  9  4  b   2.5 
#7  1  6  4  b   2.5 
#8  2  3  1  f    
#9  8  9  5  f    
#10       c   6.5 

數據:

df <- read.table(text = "target birds wolfs  Country 
          3  9   7 a 
          3  8   4 b 
          1  2   8 c 
          1  2   3 a 
          1  8   3 a 
          6  1   2 a 
          6  7   1 b 
          6  1   5 c ",header = TRUE) 
df2 <- aggregate(wolfs ~ Country , data = df, FUN = mean) 
colnames(df2) <- c("Country", "Append_Country") 
df1<-read.table(text = "  target birds wolfs  Country 
           6  4   5  a  
           4  5   3  a  
           3  8   2  a  
           1  6   4  b  
           3  5   1  a  
           2  2   1  b  
           9  9   4  b  
           8  9   5  f  
           2  3   1  f ",header = TRUE) 
+1

謝謝@RHertel。 – mql4beginner

+0

不客氣,很高興我能幫上忙 :) – RHertel

0

我'使用sqldf軟件包添加我自己的答案雖然我認爲@RHertel的解決方案更好,因爲他的解決方案基於base-R函數。

df_sq<-sqldf("select country as country_main, avg(wolfs) as Append_Country from df group by Country") 
df_sq 
    country_main Append_Country 
1   a   3.75 
2   b   2.50 
3   c   6.50 

df_sq1<-sqldf("select df1.*,df_sq.Append_Country from df1 left join df_sq on df_sq.country_main=df1.Country") 

df_sq1 
    target birds wolfs Country Append_Country 
1  6  4  5  a   3.75 
2  4  5  3  a   3.75 
3  3  8  2  a   3.75 
4  1  6  4  b   2.50 
5  3  5  1  a   3.75 
6  2  2  1  b   2.50 
7  9  9  4  b   2.50 
8  8  9  5  c   6.50 
9  2  3  1  c   6.50 
相關問題