有什么好方法可以用mutate創建一個dplyr管道,在一個步驟中從一個函式中提取幾個列?例如,設想你有一個這樣的資料框架:
x y
1 5
2 3
6 4
而你有一個同時回傳總和和乘積的函式:
sum_and_product < - function(x, y) list(sum=x y。 product=x*y)
那么,如何使一個管道產生原始的資料框架,并通過單一的呼叫計算的總和和乘積列來豐富?類似于:
df %> % mutate_multiple(c(sum。 product)=sum_and_product(x, y))?
x y sum product
1 5 6 5
2 3 5 6
6 4 10 24
如果這不能用dplyr管道來完成,還有什么其他的替代方法?
為了讓你更好地了解我在實際生活中的用例中想要實作的目標。我需要計算存盤在單個資料框架中的多個時間序列的結構變化點。當我只計算斷裂發生的時間點時,我可以很簡單有效地完成這個任務:
df %> % group_by(timeseries_id) %>% mutate(cpt = my. cpt(time, value))
但問題是,cpt必須回傳3個值,而不是只有一個(改變的時間、之前的值和之后的值),這就破壞了一切。當我用一個回圈做的時候,它非常慢(而且也很難看)。我想我可以寫3個函式,每個值提取一個,但顯然這并不理想。
如果有任何建議,我們將不勝感激。
致以最誠摯的問候。 Nikolai
uj5u.com熱心網友回復:
把你的函式從list改成data.frame就可以了,即:
library(dplyr)
sum_and_product <- function(x, y) data. frame(sum=x y。 product=x*y)
df %>%
mutate(sum_and_product(x,y))
# x y sum product
#1 1 5 6 5
#2 2 3 5 6
#3 6 4 10 24
uj5u.com熱心網友回復:
你可以將sum_and_product的輸出保存為一個串列,然后使用unnest_wider從其中獲得不同的列。
library(dplyr)
library(tidyr)
sum_and_product < - function(x, y) list(sum=x y。 product=x*y)
df%>%
rowwise() %>%
mutate(z = list(sum_and_product(x, y)) %> %
unnest_wider(/span>z)
# x y sum product
# <int> <int> <int> <int>
#1 1 5 6 5
#2 2 3 5 6
#3 6 4 10 24
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334043.html
標籤:
下一篇:R命令`group_by`。
