【问题标题】:R error: Wrong length for a vector, should be 2R 错误:向量的长度错误,应为 2
【发布时间】: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 &lt;- myfunc(x$id, 20)应该返回你想要的。
  • 如果我这样做,它会给我一个错误: .pointsToMatrix(p2) 中的错误:向量的长度错误,应该是 2 另外:警告消息:在 id == xid 中:更长的对象长度不是较短对象长度的倍数。我的实际定义是 myfunc(xid,pvalue) 我在其中有一行: result
  • 看来问题出在功能上,请编辑您的帖子并添加myfunc的代码。
  • @DrDom 我已经编辑过了!
  • 请提供您的完整功能并使您的代码可重现以启用测试。你函数中的for 循环让我很怀疑。

标签: r user-defined-functions lapply sapply


【解决方案1】:

如果没有完整的代码,很难提供帮助,但这里有一些提示。首先可以得到需要处理的id的逻辑向量,然后使用向量化的ifelsestatment。

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

【讨论】:

  • 哦!由于 R 中没有关于错误发生位置的详细解释,我假设它与传递参数或子集部分有关!我想我发现了错误发生的地方!我没想到它可能与函数的内部有关!非常感谢!
  • 该错误可能是由您隐藏的代码引起的,因为您的原始功能对我有效并且仅返回警告消息。在 R 中,最好避免 for 循环并使用矢量化函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多