1

動物のタグ ID (1,2,3)、タイプ (A,B)、および各「食事」で与えられる飼料の量 (kg) で構成される、3 匹の動物の給餌データを含むデータセットがあります。

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

以下のように、2 つの 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 にはlevelとfactorがあり、問題をよりエレガントに解決できると感じています

PS: この質問は私のものと多少似ていますが、私の問題の解決策が含まれていたとしても、それは私を逃れます。

4

2 に答える 2

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
于 2013-08-06T09:01:08.200 に答える
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
于 2013-08-06T08:59:05.337 に答える