R 如何添加值与另一列对应的列?

R 如何添加值与另一列对应的列?,r,dataframe,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 但是我想在第一

我将总结如何获得我使用的数据帧:

     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
但是我想在第一个数据帧中添加一列,这样就有了冗余的条目和相对值(实际的数据集中有其他信息,通过聚合它们我会丢失这些信息)

我想我可以用暴力来解决这个问题,但我对R比较陌生,不知道你们会想出什么巧妙的方法


谢谢

您可以使用
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

如果您可以使用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
库(dplyr)
df%>%
突变(s=总和(丰度))%>%
分组单位(名称)%>%
变异(相对_ab=总和(丰度)/s,s=空)
姓名和地址
1乔10.4
2 tim 1 0.2
3鲍勃10.4
4乔10.4
5鲍勃10.4

我们可以使用基本R
ave
name
分组,并将组
丰度
总和
除以完整的
丰度

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

df$relative_ab我们可以用
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
merge(df1,df2,by=“name”)
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