1. ホーム
  2. r

R data.tableに複数の列を1つの関数呼び出しで追加しますか?

2023-08-15 18:59:42

質問

私はリストで2つの値を返す関数を持っています。両方の値は、2つの新しい列でdata.tableに追加される必要があります。関数の評価はコストがかかるので、私は関数を2回計算することを避けたいと思います。以下はその例です。

library(data.table)
example(data.table)
DT
   x y  v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1  4
5: b 3  5
6: b 6  6
7: c 1  7
8: c 3  8
9: c 6  9

ここに私の関数の例があります。計算コストがかかる上に、与えられた他の値から一つの返り値を推論する方法がない(下の例のように)と言ったことを思い出してください。

myfun <- function (y, v) 
{
ret1 = y + v
ret2 = y - v
return(list(r1 = ret1, r2 = ret2))
}

これは、1つのステートメントで2つのカラムを追加する私の方法です。しかし、これはmyfunを2回呼び出す必要があります。

DT[,new1:=myfun(y,v)$r1][,new2:=myfun(y,v)$r2]

   x y  v new1 new2
1: a 1 42   43  -41
2: a 3 42   45  -39
3: a 6 42   48  -36
4: b 1  4    5   -3
5: b 3  5    8   -2
6: b 6  6   12    0
7: c 1  7    8   -6
8: c 3  8   11   -5
9: c 6  9   15   -3

これを行う方法について何か提案はありますか?私は保存することができます r2 を別の環境に保存することができますが、私はただ一度に参照によって2つの列を追加する方法が必要です。

どのように解決するのですか?

では data.table v1.8.3 では、このようにすることができます。

DT[, c("new1","new2") := myfun(y,v)]

もう一つの方法は、関数の出力を保存して、列を一つずつ追加していく方法です。

z <- myfun(DT$y,DT$v)
head(DT[,new1:=z$r1][,new2:=z$r2])
#      x y  v new1 new2
# [1,] a 1 42   43  -41
# [2,] a 3 42   45  -39
# [3,] a 6 42   48  -36
# [4,] b 1  4    5   -3
# [5,] b 3  5    8   -2
# [6,] b 6  6   12    0