14

リストを返す実際の問題に関数があります。これを dplyr mutate() で使用する方法はありますか? このおもちゃの例は機能しません -:

it = data.table(c("a","a","b","b","c"),c(1,2,3,4,5), c(2,3,4,2,2))

myfun = function(arg1,arg2) {

temp1 = arg1 + arg2
temp2 = arg1 - arg2
list(temp1,temp2)

}

myfun(1,2)

it%.%mutate(new = myfun(V2,V3))

新しい変数の最初の「列」で関数の出力を循環していることがわかりますが、その理由はわかりません。

ありがとう!

4

3 に答える 3

10

これを行う慣用的な方法は、 (参照による代入) 演算子data.tableを使用することです。:=以下に図を示します。

it[, c(paste0("V", 4:5)) := myfun(V2, V3)]

本当にリストが必要な場合は、次のようにしてください。

as.list(it[, myfun(V2, V3)])

あるいは、これはあなたが望むものかもしれませんが、data.table機能を使用しないのはなぜですか:

it[, c(.SD, myfun(V2, V3))]
#    V1 V2 V3 V4 V5
# 1:  a  1  2  3 -1
# 2:  a  2  3  5 -1
# 3:  b  3  4  7 -1
# 4:  b  4  2  6  2
# 5:  c  5  2  7  3    

myfun出力に名前を付ける場合、名前は最終結果の列に表示されることに注意してください。

#    V1 V2 V3 new.1 new.2
# 1:  a  1  2     3    -1
# 2:  a  2  3     5    -1
# 3:  b  3  4     7    -1
# 4:  b  4  2     6     2
# 5:  c  5  2     7     3    
于 2014-02-07T15:00:38.747 に答える
-1

mutate() 関数は、既存のデータ フレームに新しい列を追加するように設計されています。データ フレームは、同じ長さのベクトルのリストです。したがって、リストはベクトルではないため、リストを新しい列として追加することはできません。

関数を 2 つの関数として書き直して、それぞれがベクトルを返すようにすることができます。次に、mutate() を使用してこれらのそれぞれを個別に適用すると、機能するはずです。

于 2014-02-07T14:43:05.653 に答える