簡體   English   中英

如何在dplyr中更改循環

[英]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為我的數據框創建滯后變量。

我們可以使用shiftdata.table ,這可能需要采取多種valuees的n 根據?shift

n-非負整數向量,表示領先或落后於輸入的偏移量。 要創建多個超前/滯后矢量,請為n提供多個值

轉換“data.frame”到“data.table”( setDT ), order通過“的stationID”,“測試”,“VisitDate” i通過“的stationID”,“測試”分組),得到lag (默認typeshift是“結果”的“滯后”),其中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM