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

Когда я бегу:Я пытаюсь использовать tapply() для dataframe в R.Getting ошибку при обращении с помощью индекса

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

Вы не ссылки на столбцы правильно, он должен быть 'ДФ [, 3] * ДФ [, 4], ДФ [2]' – emilliman5

+1

или 'ДФ [[3]]' и т.д. –

ответ

0

tapply ожидает в общем случае получить два векторных аргумента и функцию, но, используя единичные квадратные скобки для подмножества, вы дали ему два списка. Второй (INDEX) преобразуется из списка (длина 1) в коэффициент (длина 3) внутри, а затем отличается от первой (X). Unlisting - это один из вариантов, хотя, как указано в @ emilliman5, лучше ссылаться на столбец таблицы данных.

> 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