2011-12-18 1 views
1

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

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

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

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

Специфическая ошибка я получаю:

В as.integer (validSession) == as.integer (ы): л onger длина объекта не кратна длине короче объекта

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

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

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

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

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

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

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

+0

Можете ли вы предоставить некоторые данные образца? – Chase

+0

Я комментирую, а не отвечаю, так как это будет трудно решить без воспроизводимого примера. Однако это вряд ли будет связано с принуждением ('as.integer').Вы уверены, что validSession всегда будет такой же длины, как и s? Возможно, вы хотели использовать '% in %', а не' == '? – joran

+0

Если вы используете инструменты отладки (http://stackoverflow.com/questions/1882734/what-is-your-favorite-r-debugging-trick/5156351#5156351), вы сможете сравнить то, что считаете ваши данные похоже на то, что он на самом деле делает. В частности, попробуйте установить параметры (ошибка = восстановить). –

ответ

2

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

То есть, transform уже подает subset(mediandf,validSession==s) за каждые s в unique(mediandf$validSession).

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

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

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

+0

Спасибо за ваш ответ, но это не даст правильных значений. Я ищу медиану значений из другого фрейма данных (EDB, а не mediandf). Я думаю, проблема проста в том, что я не понял, что преобразование будет кормить весь вектор в мой udf, который я намеревался получить только одно целое в качестве аргумента. –

+0

ах, я понимаю сейчас. Я согласен - вы можете попробовать «print (s)» в «medianfuncEDB», чтобы убедиться, что они все одинаковы в каждом вызове функции (они должны быть), и просто что-то вроде 'as.integer (s) [ 1]. –