2

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

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"

任何帮助使计数器增加将不胜感激。

4

2 回答 2

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"   
于 2013-12-12T06:12:44.040 回答
1

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

您可能希望在父环境中维护 counter 变量并使用 <<- 运算符对其进行更新。像这样的东西可以为您的示例解决问题:

f = function(x) {
  if (x == "") {
    counter <<- counter + 1
    return(toString(counter))
  } else {
    return(toString(x))
  }
}
counter <- -9999
sapply(c("", "", "", "", "", "1/1/1998"), f)
于 2013-12-12T00:21:21.917 回答