【发布时间】:2013-05-31 16:59:57
【问题描述】:
这是我想做的事情的要点:
我有 2 个数据框:
x(id 是唯一的)
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
y(id 不唯一)
id value1 value2
282462839 300 100
282462839 300 200
282462839 400 300
282462999 500 400
282462999 300 150
我还有一个函数 myfunc(id,pvalue) 计算一些东西并根据 pvalue 和其他 value1s 返回 value2 值之一(比 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
当我只给出在 $t20 中复制 $id 的平均值时,它就可以工作。
我该怎么做?
编辑 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)
}
【问题讨论】:
-
如果你的函数
myfunc被向量化了x$t20 <- myfunc(x$id, 20)应该返回你想要的。 -
如果我这样做,它会给我一个错误: .pointsToMatrix(p2) 中的错误:向量的长度错误,应该是 2 另外:警告消息:在 id == xid 中:更长的对象长度不是较短对象长度的倍数。我的实际定义是 myfunc(xid,pvalue) 我在其中有一行: result
-
看来问题出在功能上,请编辑您的帖子并添加
myfunc的代码。 -
@DrDom 我已经编辑过了!
-
请提供您的完整功能并使您的代码可重现以启用测试。你函数中的
for循环让我很怀疑。
标签: r user-defined-functions lapply sapply