在日期/因子向量字段上使用sapply - 包括递增值

时间:2013-12-11 22:45:55

标签: r sapply

我有一个日期字段(因子类转换为字符串),缺少值,我想用每个缺失值的序列号填充。到目前为止,这是我的代码......

f<- function(x, counter){
  if(x == ""){
      counter = counter + 1; return (toString(counter))
  } else{
      return (toString(x))
  }
}
sapply(x$DateTime_, f, -9999)

计数器不会递增并返回如下的向量:

[1] "-9998"    "-9998"    "-9998"    "-9998"    "-9998"    "1/1/1998"

任何帮助让计数器增加的帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

这是实现同一目标的另一种方法。它利用逻辑索引和固有的矢量化比较和替换运算符:

dates <- c("", "", "", "", "", "1/1/1998", "")
blanks <- dates == ""

dates[blanks] <- seq(from=-9999, by=1, length.out=sum(blanks))

dates
# [1] "-9999"    "-9998"    "-9997"    "-9996"    "-9995"    "1/1/1998" "-9994"   

答案 1 :(得分:1)

你的函数将-9999传递给f的每次调用,然后将其递增1.这就是每次返回-9998的原因。

您可能希望在父环境中维护计数器变量,并使用&lt;&lt; - 运算符更新它。像这样的东西可以解决你的例子:

f = function(x) {
  if (x == "") {
    counter <<- counter + 1
    return(toString(counter))
  } else {
    return(toString(x))
  }
}
counter <- -9999
sapply(c("", "", "", "", "", "1/1/1998"), f)