2013-06-05 5 views
0

Вот суть того, что я хочу сделать:R Ошибка: Неправильная длина вектора, должна быть 2

У меня есть 2 кадр данных:
х (идентификатор уникален)

id   timestamp 
282462839 2012-12-05 10:55:00 
282462992 2012-12-05 12:08:00 
282462740 2012-12-05 12:13:00 
282462999 2012-12-05 12:48:00 

у (идентификатор не является уникальным)

id   value1 value2 
282462839 300  100 
282462839 300  200 
282462839 400  300 
282462999 500  400 
282462999 300  150 

у меня также есть функция MyFunc (идентификатор, p-значение), которая вычисляет что-то и возвращает одно из значений value2 в зависимости от p-значения и других value1s (более сложного, чем just pvalue == value1)

Я хочу создать третий столбец для x, который содержит соответствующий вычисленный myfunc (id, pvalue), где pvalue является целым числом, которое является постоянным (скажем, 20).

так, в сущности, я хочу сделать это:

x$t20 <- myfunc(x$id,20) 

Я попытался с помощью lappy и sapply таким образом:

x$t20 <- sapply(as.vector(x$id),myfunc,pvalue=20) 

Я попытался с помощью lapply и без as.vector, а также, но я постоянно получаю эту ошибку:

Error in .pointsToMatrix(p2) : Wrong length for a vector, should be 2 

это работает, когда я просто дать имею в виду, где он просто дублирует $ ID в $ t20.

Как это сделать?

EDIT 1: Вот скелет MyFunc:

myfunc <- function(xid,pvalue) { 
    result <- subset(y,id==xid) 
    retVal <- -1 
    if(nrow(result) < 12){ 
    return(NaN) 
    } 
    for(i in (1:nrow(result))){ 
    #code to process result 
    } 
    return(retVal) 
} 
+0

Если ваша функция 'myfunc' векторизована' x $ t20 <- myfunc (x $ id, 20) 'должна возвращать то, что вы хотите. – DrDom

+0

Если это так, это дает мне ошибку: Ошибка в .pointsToMatrix (p2): Неверная длина для вектора должна быть 2 . Кроме того: Предупреждающее сообщение: В id == xid: длина длинного объекта не является кратное короткой длине объекта. мое фактическое определение MyFunc (XID, p-значение) Существует линия, где я делаю: результат <- подмножество (у, идентификатор == XID) Я попытался изменить его Xid [1], но это все-таки дал длина вектора должна быть 2 ошибки – orderof1

+0

Кажется, что проблема в функции, пожалуйста, отредактируйте сообщение и добавьте код 'myfunc'. – DrDom

ответ

1

Это было очень трудно, чтобы помочь без полного кода, но вот несколько советов. Сначала вы можете получить логический вектор id, который должен быть обработан, а затем использовать векторизованный ifelse statment.

tmp <- table(y$id) >= 12 
y$t20 <- ifelse(tmp[as.character(y$id)], your_new_func(), NaN) 
+0

О! Поскольку в R не было подробного объяснения, где произошла ошибка, я предполагал, что это связано с передачей аргумента или части подмножества! Я думаю, что узнал, где произошла ошибка! Мне не показалось, что это может быть с внутренними функциями! Спасибо огромное! – orderof1

+0

Ошибка, вероятно, вызвана вашим кодом, который вы спрятали, потому что ваша оригинальная функция работает для меня и перенастраивает только предупреждающее сообщение.В R лучше избегать цикла 'for' и использовать векторизованные функции. – DrDom