【问题标题】:How to add a column with values corresponding to another column?如何添加与另一列对应的值的列?
【发布时间】:2017-06-07 00:40:26
【问题描述】:

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

     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 比较陌生,想知道你们可能会想出什么巧妙的方法。

谢谢!

【问题讨论】:

  • merge(df1, df2, by="name")

标签: r dataframe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我们可以使用基本 R avename 分组,然后将组 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
      

      【讨论】:

        【解决方案4】:

        我们可以通过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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-06
          • 1970-01-01
          • 2018-06-22
          • 1970-01-01
          • 2021-11-19
          • 2021-04-11
          • 2013-07-25
          • 1970-01-01
          相关资源
          最近更新 更多