【问题标题】:aggregate by two columns with missing values按缺失值的两列聚合
【发布时间】:2021-12-12 01:44:24
【问题描述】:

我需要按两个分类列聚合(分组)数据框,但一列有一些缺失值(按设计)。但是,聚合函数会删除具有缺失值的行。 还有其他方法可以保留两个分类列的所有组合吗?

这是一个可重现的例子:

汇总二氧化碳数据:

aggregate(. ~Plant+Type, data=CO2, sum, na.rm=TRUE) 

添加缺少“类型”的行:

new = data.frame(Plant="Test",Type = "",Treatment=7, conc = 200, uptake = 200,stringsAsFactors = FALSE)
CO2 = rbind(CO2,new)

聚合新数据不会改变输出:

aggregate(. ~Plant+Type, data=CO2, sum, na.rm=TRUE)

我期望得到的是带有植物“测试”的新行:

   Plant        Type Treatment conc uptake
1    Qn1      Quebec         7 2950  216.6
2    Qn2      Quebec         7 3045  246.1
3    Qn3      Quebec         7 3045  263.3
4    Qc1      Quebec        14 3045  209.8
5    Qc3      Quebec        14 3045  228.1
6    Qc2      Quebec        14 3045  228.9
7    Mn3 Mississippi         7 3045  168.8
8    Mn2 Mississippi         7 3045  191.4
9    Mn1 Mississippi         7 3045  184.8
10   Mc2 Mississippi        14 3045   85.0
11   Mc3 Mississippi        14 3045  121.1
12   Mc1 Mississippi        14 3045  126.0
13   Test                    7  200  200

【问题讨论】:

    标签: r aggregation


    【解决方案1】:

    基于https://stackoverflow.com/a/8212864的回答

    一种方法是使用 plyr 库中的 ddply:

    library(plyr)
    groupColumns = c("Plant","Type")
    dataColumns = c("conc","uptake")
    
    res = ddply(CO2, groupColumns, function(x) colSums(x[dataColumns]))
    res
    
       Plant        Type conc uptake
    1    Qn1      Quebec 3045  232.6
    2    Qn2      Quebec 3045  246.1
    3    Qn3      Quebec 3045  263.3
    4    Qc1      Quebec 3045  209.8
    5    Qc3      Quebec 3045  228.1
    6    Qc2      Quebec 3045  228.9
    7    Mn3 Mississippi 3045  168.8
    8    Mn2 Mississippi 3045  191.4
    9    Mn1 Mississippi 3045  184.8
    10   Mc2 Mississippi 3045   85.0
    11   Mc3 Mississippi 3045  121.1
    12   Mc1 Mississippi 3045  126.0
    
    new = data.frame(Plant="Test",Type = "",Treatment=7, conc = 200, uptake = 200,stringsAsFactors = FALSE)
    CO2 = rbind(CO2,new)
    res = ddply(CO2, groupColumns, function(x) colSums(x[dataColumns]))
    res
       Plant        Type conc uptake
    1    Qn1      Quebec 3045  232.6
    2    Qn2      Quebec 3045  246.1
    3    Qn3      Quebec 3045  263.3
    4    Qc1      Quebec 3045  209.8
    5    Qc3      Quebec 3045  228.1
    6    Qc2      Quebec 3045  228.9
    7    Mn3 Mississippi 3045  168.8
    8    Mn2 Mississippi 3045  191.4
    9    Mn1 Mississippi 3045  184.8
    10   Mc2 Mississippi 3045   85.0
    11   Mc3 Mississippi 3045  121.1
    12   Mc1 Mississippi 3045  126.0
    13  Test              200  200.0
    

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2017-08-08
      相关资源
      最近更新 更多