[英]How to mutate for loop in dplyr
我想為數據框中的列創建多個滯后變量,以獲取一系列值。 我的代碼可以成功完成我想做的事,但不能滿足我的需要(數百次迭代)
我下面的代碼可以成功完成我想要的操作,但無法滿足我的需要(數百次迭代)
Lake_Lag <- Lake_Champlain_long.term_monitoring_1992_2016 %>%
group_by(StationID,Test) %>%
arrange(StationID,Test,VisitDate) %>%
mutate(lag.Result1 = dplyr::lag(Result, n = 1, default = NA))%>%
mutate(lag.Result5 = dplyr::lag(Result, n = 5, default = NA))%>%
mutate(lag.Result10 = dplyr::lag(Result, n = 10, default = NA))%>%
mutate(lag.Result15 = dplyr::lag(Result, n = 15, default = NA))%>%
mutate(lag.Result20 = dplyr::lag(Result, n = 20, default = NA))
我希望能夠使用列表c(1,5,10,15,20)或范圍1:150為我的數據框創建滯后變量。
我們可以使用shift
從data.table
,這可能需要采取多種valuees的n
。 根據?shift
n-非負整數向量,表示領先或落后於輸入的偏移量。 要創建多個超前/滯后矢量,請為n提供多個值
轉換“data.frame”到“data.table”( setDT
), order
通過“的stationID”,“測試”,“VisitDate” i
通過“的stationID”,“測試”分組),得到lag
(默認type
的shift
是“結果”的“滯后”),其中n
是值的向量,並將輸出(( :=
)分配給列名的向量(使用paste0
創建)
library(data.table)
i1 <- c(1, 5, 10, 15, 20)
setDT(Lake_Champlain_long.term_monitoring_1992_2016)[order(StationID,
Test, VisitDate), paste0("lag.Result", i) := shift(Result, n= i),
by = .(StationID, Test)][]
注意:顯示了一個非常有效的解決方案
下面是利用包括在一些“整潔的eval幫手”的方法dplyr
是來自rlang
包。
基本思想是在mutate()
創建一個新列,其名稱基於for循環提供的字符串。
library(dplyr)
grouped_data <- Lake_Champlain_long.term_monitoring_1992_2016 %>%
group_by(StationID,Test) %>%
arrange(StationID,Test,VisitDate)
for (lag_size in c(1, 5, 10, 15, 20)) {
new_col_name <- paste0("lag_result_", lag_size)
grouped_data <- grouped_data %>%
mutate(!!sym(new_col_name) := lag(Result, n = lag_size, default = NA))
}
當使用dplyr
包中的mutate()
或dplyr
summarize()
等函數時, sym(new_col_name) :=
是寫lag_result_1 =
, lag_result_2 =
等的動態方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.