[英]Return a list in dplyr mutate()
我在現實世界中的問題中有一個返回列表的函數。 有沒有辦法將它與 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))
我看到它在新變量的第一個“列”中循環遍歷函數的輸出,但不明白為什么。
謝謝!
使用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
mutate() 函數旨在向現有數據框中添加新列。 數據框是相同長度的向量列表。 因此,您不能將列表添加為新列,因為列表不是向量。
您可以將函數重寫為兩個函數,每個函數都返回一個向量。 然后使用 mutate() 分別應用這些中的每一個,它應該可以工作。
鑒於這個問題的標題,我想我會發布一個使用dplyr::mutate
的tidyverse
解決方案。 請注意, myfun
需要輸出一個data.frame
才能工作。
library(tidyverse)
it = data.frame(
v1 = c("a","a","b","b","c"),
v2 = c(1,2,3,4,5),
v3 = c(2,3,4,2,2))
myfun = function(arg1,arg2) {
temp1 = arg1 + arg2
temp2 = arg1 - arg2
data.frame(temp1, temp2)
}
it %>%
nest(data = c(v2, v3)) %>%
mutate(out = map(data, ~myfun(.$v2, .$v3))) %>%
unnest(cols = c(data, out))
#> # A tibble: 5 x 5
#> v1 v2 v3 temp1 temp2
#> <fct> <dbl> <dbl> <dbl> <dbl>
#> 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
由reprex 包(v0.3.0) 於 2020 年 2 月 4 日創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.