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

関数は f の各呼び出しに -9999 を渡し、それを 1 ずつ増やします。これが、毎回 -9998 を返す理由です。

おそらく、親環境でカウンター変数を維持し、それを <<- 演算子で更新する必要があります。このようなものは、あなたの例のトリックを行います:

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 に答える