【问题标题】:R dataframe sums of values that satisfy unique conditions满足唯一条件的值的 R 数据帧总和
【发布时间】:2013-08-07 04:35:41
【问题描述】:

我有一个数据集,其中包含 3 只动物的喂养数据,包括动物的标签 ID (1,2,3),每顿饭的饲料类型 (A,B) 和数量 (kg) ':

Animal   FeedType   Amount(kg)
Animal1     A         10
Animal2     B         7
Animal3     A         4
Animal2     A         2
Animal1     B         5
Animal2     B         6
Animal3     A         2

使用它,我希望能够输出下面的矩阵,该矩阵以 unique('Animal') 作为其行,unique('FeedType') 作为其列,并在矩阵的相应单元格中输出累积进给量 (kg)。

         A   B
Animal1  10  5
Animal2  2   13
Animal3  6   0

我开始使用两个 for 循环编写解决方案,如下所示:

dataframe = read_delim(input_url, header=TRUE, sep = ";")
animal_feed_matrix = matrix(0,nrow(unique('Animal')),nrow(unique('FeedType')))
for (i in 1:length(unique('Animal')) ){
 a= unique('Animal')[i]
  for (j in 1:length(unique('FeedType')) ){
    ft= unique('FeedType')[j]
    animal_feed_matrix[i,j] = sum(dataframe [(dataframe ['Animal']==a & dataframe ['FeedType']==ft),'Amount(kg)'])
  }
}

但我知道这是解决问题的一种非常低效的方法,(加上上面的代码需要完成才能工作)。我知道 R 有 levelsfactors,我觉得可以更优雅地解决问题。

P.S: This question 与我的有些相似,但即使我的问题的解决方案包含在其中,我也无法理解。

【问题讨论】:

    标签: r dataframe unique levels cumulative-sum


    【解决方案1】:

    在基础 R 中:

    out <- with(mydf, tapply(Amount, list(Animal, FeedType), sum))
    
             A  B
    Animal1 10  5
    Animal2  2 13
    Animal3  6 NA
    

    然后,将NA 更改为0(如您的示例所示),只需执行以下操作:

    out[is.na(out)] <- 0
    

    【讨论】:

    • 哇,这对于单行代码来说是相当强大的。奇迹般有效!只是一个简短的问题:'out' 矩阵现在太稀疏了,因为我有太多 FeedType 列。如何省略出现次数少于一定次数的 FeedType? (例如,如果在 'mydf' 中仅出现一次,我想在 'out' 中排除列 'FeedTypeA')
    • @Berkan 在运行by 之前,我可能会预处理原始数据帧,不包括低于某个阈值的 FeedTypes。但是,您可以使用以下内容从结果矩阵中删除列:out[,!colnames(out)=="A",drop=FALSE]drop=FALSE 在大型矩阵中是不必要的,但可以防止将仅包含两列的示例矩阵强制转换为向量)。
    【解决方案2】:

    您可以使用库 reshape2 中的函数 dcast() 来实现。

    library(reshape2)    
    dcast(df,Animal~FeedType,sum,value.var="Amount")
       Animal  A  B
    1 Animal1 10  5
    2 Animal2  2 13
    3 Animal3  6  0
    

    【讨论】:

    • 谢谢,但代码报错:[Using Subsector as value column: use value.var to override。 vaggregate 中的错误(.value = value,.group = 总体,.fun = fun.aggregate,:找不到函数“.fun]。此外,在这个单行中,我在哪里指定“总和”在数量上?
    • 函数 dcast() 自动使用第三列(如果只有三列)来计算总和。使用参数 value.var= 将示例更新为更通用的解决方案(以显示要使用的列)。对于您的错误-似乎在您的会话中总和被用作一些变量。看到这个SO question
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2016-10-06
    • 2020-09-08
    相关资源
    最近更新 更多