【问题标题】:Grouping dataframe rows based on variable in a separate, linked dataframe根据单独的链接数据框中的变量对数据框行进行分组
【发布时间】:2021-02-22 11:56:48
【问题描述】:

假设我有两个数据框,一个包含环境数据 (env.df) 和其他物种出现 (species.df),两者都具有相同的行名。我想根据env.df 中一列(Year)的值对species.df 中的行进行分组,然后分别计算每一年的统计数据。

env.df:

              Site  Year
A2015           A    2015
A2016           A    2016
A2017           A    2017
B2015           B    2015
B2016           B    2016
B2017           B    2017

species.df:

               Species1  Species 2 Species 3
A2015             1          1          1
A2016             0          0          1
A2017             0          0          1
B2015             1          0          1
B2016             1          1          1
B2017             1          1          0

我不想再向species.df 添加任何列,因为我需要使用的统计函数只能处理存在-不存在的按物种样本数据集。我知道如何从每年中单独选择样本——species.df[env.df$Year== '2015',] 等等——但我可以使用每年重复的一行代码来完成。我只能让dplyr group_by 函数在env.df 上工作,并且不知道如何将其扩展到链接的 species.df

非常感谢

【问题讨论】:

    标签: r dataframe grouping


    【解决方案1】:

    这更像是一个建议,因为我没有提供尊重您的约束的代码。但我也处理过生态数据,以及像“vegan”这样需要基于列的数据的包。

    我的建议是合并两个 data.frame,当您需要运行测试时,相应地设置这个 data.frame 的子集(例如,使用 x[,3:7] 或 dplyr 的 select())。对于未来的读者(包括您自己)来说,这将比让他们分开并运行充满 for 循环和合并的代码更容易和更容易理解。

    【讨论】:

      【解决方案2】:

      你想要这样的东西吗?

      lapply(
        with(env.df, split(row.names(env.df), Year)),
        function(k) species.df[k, ]
      )
      

      给予

      $`2015`
            Species1 Species2 Species3
      A2015        1        1        1
      B2015        1        0        1
      
      $`2016`
            Species1 Species2 Species3
      A2016        0        0        1
      B2016        1        1        1
      
      $`2017`
            Species1 Species2 Species3
      A2017        0        0        1
      B2017        1        1        0
      

      或者

      split(
        cbind(
          env.df,
          species.df[match(row.names(species.df), row.names(env.df)), ]
        ),
        env.df$Year
      )
      

      给了

      $`2015`
            Site Year Species1 Species2 Species3
      A2015    A 2015        1        1        1
      B2015    B 2015        1        0        1
      
      $`2016`
            Site Year Species1 Species2 Species3
      A2016    A 2016        0        0        1
      B2016    B 2016        1        1        1
      
      $`2017`
            Site Year Species1 Species2 Species3
      A2017    A 2017        0        0        1
      B2017    B 2017        1        1        0
      

      【讨论】:

        【解决方案3】:

        或者我们在base R中使用mergesplit

        out <- merge(env.df, species.df, by = 'row.names')
        row.names(out) <- out$Row.names
        split(out[startsWith(names(out), 'Species')], out$Year)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-05
          • 2021-09-29
          • 1970-01-01
          • 2016-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多