функция tapply жалуется, что аргументы имеют разную длину, но они кажутся одинаковыми

Вот неудачный вызов, сообщения об ошибках и некоторые дисплеи, показывающие длину, о которой идет речь:

it <- tapply(molten, c(molten$Activity, molten$Subject, molten$variable), mean)
# Error in tapply(molten, c(molten$Activity, molten$Subject, molten$variable),  : 
#  arguments must have same length

length(molten$Activity)
# [1] 679734

length(molten$Subject)
# [1] 679734

length(molten$variable)
# [1] 679734

dim(molten)
# [1] 679734      4

str(molten)
# 'data.frame': 679734 obs. of  4 variables:
#  $ Activity: Factor w/ 6 levels "WALKING","WALKING_UPSTAIRS",..: 5 5 5 5 5 5 5 5 5 5 ...
#  $ Subject : Factor w/ 30 levels "1","2","3","4",..: 2 2 2 2 2 2 2 2 2 2 ...
#  $ variable: Factor w/ 66 levels "tBodyAcc-mean()-X",..: 1 1 1 1 1 1 1 1 1 1 ...
#  $ value   : num  0.257 0.286 0.275 0.27 0.275 ...

person gregbowman    schedule 25.04.2014    source источник


Ответы (2)


Если вы посмотрите на ?tapply, вы увидите, что X должен быть "атомарным объектом, обычно вектором". Вы передаете tapply фрейм данных («расплавленный»), который не является атомарным объектом. См. is.atomic и попробуйте is.atomic(molten). Кроме того, ваши группирующие переменные должны быть предоставлены как list (см. аргумент INDEX).

Что-то вроде этого работает:

tapply(X = warpbreaks$breaks,  INDEX = list(warpbreaks$wool, warpbreaks$tension), mean)
#          L        M        H
# A 44.55556 24.00000 24.55556
# B 28.22222 28.77778 18.77778 
person Henrik    schedule 25.04.2014

Вам нужно иметь один объект для ИНДЕКС, ноc( )будет объединять их все вместе, что является источником ошибки, поэтому используйте список:

it <- tapply(molten$value, list(Act=molten$Activity, sub=molten$Subject, var=molten$variable), mean)

Лучше бы:

it <- with(molten , tapply(value, list(Act=Activity, Sub=Subject, var=variable), mean) )
person IRTFM    schedule 25.04.2014