1

我有一个数据集,其中包含 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,我觉得可以更优雅地解决问题。

PS: 这个问题与我的有点相似,但即使我的问题的解决方案包含在其中,它也让我无法理解。

4

2 回答 2

1

您可以使用dcast()library 中的函数来完成reshape2

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
于 2013-08-06T08:59:05.337 回答
1

在基础 R 中:

out <- with(mydf, tapply(Amount, list(Animal, FeedType), sum))

         A  B
Animal1 10  5
Animal2  2 13
Animal3  6 NA

然后,要更改NA0(如您的示例中所示),只需执行以下操作:

out[is.na(out)] <- 0
于 2013-08-06T09:01:08.200 回答