我有一个数据集,其中包含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')
为其列,矩阵的相应单元格中的累计Feed Amount(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有级别和因素,我觉得可以更优雅地解决问题。
P.S: This question有点类似于我的,但即使我的问题的解决方案包含在内,它也逃脱了我。
答案 0 :(得分:1)
您可以使用库dcast()
中的函数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
答案 1 :(得分: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