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

Referenzierung Wenn ich laufen:Ich versuche tapply() für Datenrahmen in R.Getting einen Fehler zu verwenden, bei der Verwendung von Index

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

ich diesen Fehler:

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

jedoch , wenn ich verwende:

tapply(a*f,b,cumsum) 

Ich bekomme die Ausgabe:

#apple fruits orange 
# 10  90  24 

Was ist der Unterschied? Warum passiert dies?

+4

Sie sind nicht die Spalten richtig referenzieren, sollte es 'df [3] * df [4], df [2]' – emilliman5

+1

oder 'df [[3]]' etc sein –

Antwort

0

tapply erwartet im Allgemeinen zwei Vektorargumente und die Funktion, aber indem Sie einzelne eckige Klammern verwenden, haben Sie zwei Listen angegeben. Die zweite (INDEX) wird intern von einer Liste (Länge 1) in einen Faktor (Länge 3) konvertiert, so dass sie dann eine andere Länge hat als die erste (X). Nichtlisting ist eine Option, obwohl @ emilliman5 darauf hingewiesen hat, dass es besser ist, auf die Spalte der Datentabelle zu verweisen.

> 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 
Verwandte Themen