сравнение двух целых чисел в R: более длинная длина объекта не кратна более короткой длине объекта ddply

Я получаю предупреждение «более длинная длина объекта, не кратная более короткой длине объекта» в R при сравнении двух целых чисел для подмножества кадра данных посреди определяемой пользователем функции.

Пользовательская функция просто возвращает медиану подмножества целых чисел, взятых из кадра данных:

function(s){ 
    return(median((subset(EDB,as.integer(validSession) == as.integer(s)))$absStudentDeviation))
}

(Изначально у меня не было приведений as.integer. Я поместил их туда для отладки, текста, и все равно получаю сообщение об ошибке.)

Конкретная ошибка, которую я получаю:

В as.integer(validSession) == as.integer(s): более длинная длина объекта не кратна более короткой длине объекта

Я получаю это предупреждение более 50 раз при звонке:

mediandf <- ddply(mediandf,.(validSession),
                           transform,
                           grossMed2 = medianfuncEDB(as.integer(validSession)))

Цель состоит в том, чтобы вычислить медиану $validSession, связанную с данным validSession в EDB большого фрейма данных, и присоединить этот вектор к mediaandf.

На самом деле я дважды проверил, что все значения для validSession как в фрейме данных mediaandf, так и в фрейме данных EDB являются целыми числами, путем подмножества с is.integer(validSession).

Кроме того, похоже, что команда действительно делает то, что я намеревался, я получаю новый столбец в своем фрейме данных со значениями, которые я не проверял, но я хочу понять предупреждение. если «medianfuncEDB» вызывается с целым числом в качестве входных данных, почему я получаю «более длинная длина объекта не кратна более короткой длине объекта» при вызове s == validSession?

Обратите внимание, что простые вызовы функций, такие как medianfuncEDB(5), работают без проблем, так почему же я получаю предупреждения при использовании ddply?

РЕДАКТИРОВАТЬ: я нашел проблему с помощью комментария Джорана. Я не знал, что преобразование загружает в функцию целые векторы. Вместо этого использование validSession[1] не дало никаких предупреждений.


person David R    schedule 18.12.2011    source источник
comment
Можете ли вы предоставить некоторые образцы данных?   -  person Chase    schedule 19.12.2011
comment
Я комментирую, а не отвечаю, так как это будет сложно решить без воспроизводимого примера. Однако вряд ли это связано с принуждением (as.integer). Вы уверены, что validSession всегда будет иметь ту же длину, что и s? Может быть, вы хотели использовать %in%, а не ==?   -  person joran    schedule 19.12.2011
comment
Если вы используете инструменты отладки (stackoverflow.com/questions/1882734/), вы сможете сравнить, как, по вашему мнению, выглядят ваши данные, с тем, что они на самом деле делают. В частности, попробуйте установить параметры (ошибка = восстановить).   -  person Ari B. Friedman    schedule 19.12.2011
comment
Джоран, я, должно быть, неправильно понимаю, как работает ddply. Я предполагал, что это работает построчно при преобразовании данных. Функция medianfuncDB предназначена для приема чистого целого числа, а не вектора целых чисел, поэтому, на мой взгляд, и s, и validSession являются целыми числами, а не векторами, когда их сравнивают. Возможно, я что-то упускаю из того, как здесь работает преобразование.   -  person David R    schedule 19.12.2011
comment
Хорошо, похоже, простая ошибка здесь заключается в том, что я не знал, что весь вектор был загружен в мою функцию. Я новичок в R и думал, что функция преобразования работает с каждой строкой отдельно, поэтому я думал, что это значение validSession означает (значение validSession для этой строки), а не весь вектор validSession для этого раздела фрейма данных.   -  person David R    schedule 19.12.2011
comment
Я думаю, что изменение его на validsession[1] работает. (все значения validSession одинаковы для этого сегмента фрейма данных.)   -  person David R    schedule 19.12.2011
comment
@DavidR Не стесняйтесь добавлять описание своего решения в качестве ответа, а затем принимайте его. Таким образом, люди могут сразу увидеть, что проблема решена.   -  person joran    schedule 19.12.2011


Ответы (1)


Функция ddply уже подмножает ваш фрейм данных на validSession. Следовательно, transform получает только кадр данных со всеми строками, соответствующими конкретному validSession.

То есть transform уже скармливается subset(mediandf,validSession==s) для каждого s в unique(mediandf$validSession).

Поскольку вам не нужно выполнять какие-либо поднастройки (об этом позаботится ddply), все, что вам нужно сделать, это:

ddply(mediandf,.(validSession),transform,grossMed2=median(absStudentDeviation))

И тогда вы получите mediandf обратно с новым столбцом grossMed2 со значением, которое вы хотите (так что это будет одно и то же значение в каждом уникальном validSession).

person mathematical.coffee    schedule 19.12.2011
comment
Спасибо за ваш ответ, но это не даст правильных значений. Я ищу медиану значений из другого фрейма данных (EDB, а не mediandf). Я думаю, проблема просто в том, что я не понимал, что преобразование будет передавать весь вектор в мой udf, который я намеревался получить только одним целым числом в качестве аргумента. - person David R; 19.12.2011
comment
ааа, теперь я понимаю. Я согласен - вы можете попробовать print(s) в medianfuncEDB, просто чтобы убедиться, что они все одинаковы в каждом вызове функции (они должны быть), и тогда что-то вроде as.integer(s)[1]. - person mathematical.coffee; 19.12.2011