1

data.tableを使用して、特定の値(0および99)のNAを変数のグループ(p05_1からp05_9までの9つの変数)に割り当てようとしています。エラーは発生しませんが、次のコードを使用しても何も起こりません。

ここに短い例があります:

v_1  <- c(0,0,1,2,3,4,4,99)
v_2  <- c(1,2,2,2,3,99,1,0)
dat  <-  data.table(v_1,v_2)

for(n in 1:9) {
  char <- sprintf('p05_%s', n)
  st[eval(parse(text=char)) %in% c(0,99), eval(parse(text=char)) := NA_integer_]
}

一番。

4

3 に答える 3

2

これはこの質問と回答に関連しています

data.tableを使用モードにするeval in jには、呼び出し全体がeval(...)である必要があります。

それ以外の場合、呼び出しは次のように解析されます

`:=`(eval(parse(text=char)), NA_integer_)

j byでevalを使おうとしているので、これは取り上げられません[.data.table。私はテストしていませんがi、とにかくこれを行うのは安全かもしれません

何かのようなもの

for(n in 1:2) {
  chari <-  paste0(sprintf('v_%s' ,n), ' %in% c(0,99)')
  charj <- sprintf('v_%s := NA_integer_', n)
  dat[eval(parse(text=chari)), eval(parse(text=charj))]
}

動作するはずです。通常の文字として使用してエラーが発生し%in%ないように、への呼び出しをごまかしていることに注意してください。sprintf%

于 2012-12-06T01:54:36.363 に答える
2

eval(parse(text=ルートの代替、この場合:

for (n in 1:2) {
    vnam = paste0("v_",n)
    set(dat, which(dat[[vnam]]%in%c(0,99)), vnam, NA_integer_)
}

[[ベースRでは列のコピー(コピーオンライト)を取得しないため、単一の列を参照するのに適した方法であることに注意してください。ループset[[ていて、列がたくさんある場合(たとえば、10,000以上)は価値があります。

于 2012-12-06T10:03:10.587 に答える
0

replace()関数を使用する別の方法は次のとおりです。

> dat[, lapply(list(v_1, v_2), function(x) replace(x, x %in% c(0, 99), NA_integer_))]
   V1 V2
1: NA  1
2: NA  2
3:  1  2
4:  2  2
5:  3  3
6:  4 NA
7:  4  1
8: NA NA
于 2012-12-07T02:32:56.027 に答える