3

クラスや一般的なパターン マッチングなどの条件で列を処理したいと考えていますgrep

私の最初の試みはうまくいきませんでした:

require(data.table)
test.table <- data.table(a=1:10,ab=1:10,b=101:110)
##this does not work and hangs on my machine
test.table[,lapply(names(test.table)[grep("a",names(test.table))], get)]

Ricardo Saporta は、この構造を使用できるが、ダミー関数でラップする必要があることを回答で指摘しています。get

##this works
test.table[,lapply(names(test.table)[grep("a",names(test.table))], function(x) get(x))]

なぜ匿名関数が必要なのですか?

(好ましい/よりクリーンな方法は.SDcols:)経由です

test.table[,.SD,.SDcols=grep("a",names(test.table))]
test.table[, grep("a", names(test.table), with = FALSE]
4

3 に答える 3

2

これは の機能でありlapply、実際data.table にはlapplyドキュメントから:

歴史的な理由から、lapply によって作成された呼び出しは評価されておらず、これに依存するコード (bquote など) が記述されています。これは、記録された呼び出しが常に FUN(X[[0L]], ...) の形式であり、0L が現在の整数インデックスに置き換えられることを意味します。これは通常は問題になりませんが、FUN が sys.call または match.call を使用する場合、または呼び出しを使用するプリミティブ関数である場合に問題になる可能性があります。これは、多くの場合、ラッパーを使用してプリミティブ関数を呼び出す方が安全であることを意味します。そのため、R 2.7.1 では is.numeric のメソッドディスパッチが確実に行われるように lapply(ll, function(x) is.numeric(x)) が必要です。正しく。

@Hadley と @DWin のコメントを更新します。

EE <- new.env()
EE$var1 <- "I am var1 in EE"
EE$var2 <- "I am var2 in EE"

## Calling get directly
with(EE, lapply(c("var1", "var2"), get))
Error in FUN(c("var1", "var2")[[1L]], ...) : object 'var1' not found

## Calling get via an anonymous function
with(EE, lapply(c("var1", "var2"), function(x) get(x)))
[[1]]
[1] "I am var1 in EE"

[[2]]
[1] "I am var2 in EE"

with(EE, lapply(c("var1", "var2"), rm))
Error in FUN(c("var1", "var2")[[1L]], ...) : 
  ... must contain names or character strings

with(EE, lapply(c("var1", "var2"), function(x) rm(x)))
[[1]]
NULL

[[2]]
NULL

# var1 & var2 have now been removed
EE
<environment: 0x1154d0060>
于 2013-08-05T18:42:26.983 に答える
-1

これは、data.table がj() expression(簡単に言えば、最初のカンマ以降のすべてをDT[,...])実際の式として評価DT[,"Column1"]するためです。"Column1"with(DT, "Column1")"Column1"

必要に応じて、次のことができます。

DT[,names(test.table),with=F]
于 2013-08-05T18:05:42.360 に答える