如何添加包含与其他列对应的值的列?

时间:2017-06-07 00:40:27

标签: r dataframe

我将总结如何获得与之合作的数据帧:

     name abundance 
1    joe  1
2    tim  1
3    bob  1
4    joe  1 
5    bob  1

首先,我通过聚合列创建了一个新的数据框,并计算了相对频率的含义:

     name  abundance  relative_ab
1    joe   2          0.4
2    tim   1          0.2
3    bob   2          0.4

但我想在第一个数据框中添加一个列,以便有一个像relative_ab这样的冗余条目(实际的数据集中包含其他信息,我会通过聚合来丢失信息)。

     name abundance relative_ab
1    joe  1         0.4
2    tim  1         0.2
3    bob  1         0.4
4    joe  1         0.4
5    bob  1         0.4

我想我可以蛮力这个,但我对R来说相对较新,并想知道你们会想出什么光滑的方式。

谢谢!

4 个答案:

答案 0 :(得分:2)

如果您可以使用dplyr

library(dplyr)
df %>% 
  mutate(s=sum(abundance)) %>%
  group_by(name) %>%
  mutate(relative_ab=sum(abundance)/s, s=NULL)

    name abundance relative_ab
  <fctr>     <int>       <dbl>
1    joe         1         0.4
2    tim         1         0.2
3    bob         1         0.4
4    joe         1         0.4
5    bob         1         0.4

答案 1 :(得分:0)

您可以使用match执行此操作。假设您的第一个data.frame是df1而第二个是df2,您可以使用:

df1$relative_ab = df2$relative_ab[match(df1$name, df2$name)]
df1
  name abundance relative_ab
1  joe         1         0.4
2  tim         1         0.2
3  bob         1         0.4
4  joe         1         0.4
5  bob         1         0.4

match使用名称来选择要使用的行。

match(df1$name, df2$name)
[1] 1 2 3 1 3

答案 2 :(得分:0)

我们可以使用基于ave的基础R name分组,并将小组abundance sum除以完整的abundance

df$relative_ab <- with(df,ave(abundance, name, FUN = function(x) 
                                        sum(x)/sum(abundance)))
df
#  name abundance relative_ab
#1  joe         1         0.4
#2  tim         1         0.2
#3  bob         1         0.4
#4  joe         1         0.4
#5  bob         1         0.4

答案 3 :(得分:0)

我们可以使用data.table

执行此操作
library(data.table)
setDT(df)[, relative_ab := sum(abundance)/sum(df$abundance) , name]
df
#   name abundance relative_ab
#1:  joe         1         0.4
#2:  tim         1         0.2
#3:  bob         1         0.4
#4:  joe         1         0.4
#5:  bob         1         0.4