2016-07-28 16 views
3

を式のリストを適用します、私はdata.tableと式のリストを持っているRにdata.table

DT <- data.table(A = c(1:3), B = c(3:1), C = c(4:6), D = (6:4)) 
l <- list(f1 = "A + B", f2 = "B + C", f3 = "C - D", f4 = "D/A") 

これは

DT[, ":="(f1 = A + B, f2 = B + C, f3 = C - D, f4 = D/A)] 

または

for (i in 1:length(l)) { 
    DT[, eval(names(l)[i]) := eval(parse(text=l[[i]]))] 
} 
によって達成することができます

ループを使用せずにlの情報を使用してこれを行う方法はありますか?

# some code 
DT 
# A B C D f1 f2 f3  f4 
# 1: 1 3 4 6 4 7 -2 6.000000 
# 2: 2 2 5 5 4 7 0 2.500000 
# 3: 3 1 6 4 4 7 2 1.333333 
+0

ループの問題は何ですか?すべてのループが悪いわけではありません。 – dayne

+0

ループを避ける方法があるかどうかを知りたいのですが... –

+0

'lapply'を使用すると、一般的に列に対するループを避けることができますが、ループを使うのは大変なことではありません。最初に、私はあなたがテキストではなく式としてこれらを保存すべきだと思います: 'L = lapply(l、function(x)parse(text = x))'。それで 'DT [、\':= \ '(names(L)、lapply(L、eval、.SD)]]'のようなものですが、 – Frank

答えて

10

あなたが手でlを構築している場合は、代わりのようにそれを書きます

L = quote(`:=`(f1 = A + B, f2 = B + C, f3 = C - D, f4 = D/A)) 

次にあなたが

0のようにそれを使用することができます
DT[, eval(L)] 

# A B C D f1 f2 f3  f4 
# 1: 1 3 4 6 4 7 -2 6.000000 
# 2: 2 2 5 5 4 7 0 2.500000 
# 3: 3 1 6 4 4 7 2 1.333333 

これは説明recommended practice from the FAQ、ある...

quote()eval()は、他の言語でのマクロのようなものです。

+0

これらの数式をグループごとに評価したいと思いますが、data.tableではこれを許可していません。私はどうしたらいいですか?前もって感謝します! –

+0

@ Nal-rA明確にするために新しい質問を投稿する必要があるかもしれません。 DT [、id:= c(1,1,2)] 'DT [、eval(L)、by = id] []' – Frank

+1

ありがとう!私は間違った方法を使っているようです。ありがとうございました! –

2

これはスーパーずさんですが、callを使用して式を作成することができ、parse、およびpaste、その式を呼び出す:

library(data.table) 
DT <- data.table(A = c(1:3), B = c(3:1), C = c(4:6), D = (6:4)) 
l <- list(f1 = "A + B", f2 = "B + C", f3 = "C - D", f4 = "D/A") 
ncall <- call(":=", names(l), 
      parse(text = paste0("list(", paste(l, collapse = ","), ")"))) 
DT[ , eval(ncall)] 
DT 
# A B C D f1 f2 f3   f4 
# 1: 1 3 4 6 4 7 -2 6.00000000 
# 2: 2 2 5 5 4 7 0 2.50000000 
# 3: 3 1 6 4 4 7 2 1.33333333 
+0

あなたの方法はグループごとにすべての数式を評価できますか?ありがとうございました! @dayne –

+0

'k'の語句を追加し、グループ別に評価することができます。 'DT [、eval(ncall)、by = list(D)'です。私はこれを明示的にテストしておらず、この例はグループ化には意味がありませんが、コードを自分でテストすることは確かです。 – dayne

関連する問題