2016-11-28 7 views
0
a<-c(1,2,3) 
b<-c("apple","orange","fruits") 
f<-c(10,12,30) 
df<-data.frame(a,b,f) 

を使用して参照するときにエラーがR.Gettingにデータフレームのためtapply()を使用しようとしています:私は実行すると、インデックス

prices<-tapply(df[1]*df[3],df[2],cumsum) 

私はこのエラーを取得する:

#Error in tapply(df[1] * df[3], df[2], cumsum) : 
# arguments must have same length 

しかし、 、私が使用する場合:

tapply(a*f,b,cumsum) 

私は出力を得る:

#apple fruits orange 
# 10  90  24 

どういう違いがありますか?なぜこうなった?

+4

は、それはDF '[3] * DF [4]、DF [2]' – emilliman5

+1

または 'DF [[3]]'などでなければなりません –

答えて

0

tapplyは一般に2つのベクトル引数と関数を受け取ることを想定していますが、1つの角括弧をサブセットとして使用して2つのリストを指定します。 2番目の数字(INDEX)はリスト(長さ1)から係数(長さ3)に内部的に変換されるため、最初のものとは異なる長さになります(X)。 @ emilliman5が指摘するように、データテーブルの列を参照する方が良いですが、unlistingもオプションです。あなたが適切に列を参照していません

> tapply(unlist(df[1]*df[3]),df[2],cumsum) 
b 
apple fruits orange 
    10  90  24 
> tapply(df[,1]*df[,3],df[,2],cumsum) 
apple fruits orange 
    10  90  24 
関連する問題