如何将分组结果从一个数据框添加到另一个数据框

时间:2015-09-13 06:43:59

标签: r dataframe

我需要附加一个列结果,其中包含每个国家/地区的平均值,从一个数据框(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。我可以这样做吗?

这是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    

2 个答案:

答案 0 :(得分: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 :(得分: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