簡體   English   中英

向量化具有多個條件的 for 循環,該循環通過 R 中的 dataframe

[英]Vectorize a for loop with multiple conditions that loops through dataframe in R

我有一個包含 700 萬行的大型數據集,我試圖通過數據框的每一行 go 並根據一組條件更改列中的值。

這需要很多時間,我想知道是否可以對過程進行矢量化,或者是否有更有效和更快的方法來實現。 我正在使用 R 代碼

我的代碼如下:

for(row in 1:nrow(tttotalCam2020)){
  viewTime <- tttotalCam2020[row, "DAY_DATE"]
  termCode <- tttotalCam2020[row, "TERM_CODE"]
  
  if(termCode=='SP1'){
    if(viewTime <= as.POSIXct("2020/01/31")){
      tttotalCam2020[row,'COURSE_PERIOD']='Early'
    }else if(as.POSIXct("2020/02/1") >= viewTime & viewTime <= as.POSIXct("2020/03/8")){
      tttotalCam2020[row,'COURSE_PERIOD']='Mid'
    }else{
      tttotalCam2020[row,'COURSE_PERIOD']='Late'
    }
  }else if(termCode=='SP2'){
    if(viewTime <=as.POSIXct("2020/03/31")){
      tttotalCam2020[row,'COURSE_PERIOD']='Early'
    }else if(as.POSIXct("2020/04/1")>=viewTime & viewTime <=as.POSIXct("2020/06/5")){
      tttotalCam2020[row,'COURSE_PERIOD']='Mid'
    }else{
      tttotalCam2020[row,'COURSE_PERIOD']='Late'
    }
  }else {
    if(viewTime <=as.POSIXct("2020/04/24")){
      tttotalCam2020[row,'COURSE_PERIOD']='Early'
    }else if(as.POSIXct("2020/04/25")>=viewTime & viewTime <=as.POSIXct("2020/05/31")){
      tttotalCam2020[row,'COURSE_PERIOD']='Mid'
    }else{
      tttotalCam2020[row,'COURSE_PERIOD']='Late'
    }

如果您可以分享我們可以測試的示例數據,將會更容易提供幫助。

dplyr::case_when解決方案可能如下所示:

library(dplyr)

tttotalCam2020 %>%
  mutate(COURSE_PERIOD = case_when(
    termCode == "SP1" & viewtime <= as.POSIXct("2020/01/31") ~ "Early",
    termCode == "SP1" & viewtime <= as.POSIXct("2020/03/08") ~ "Mid",
    # etc.
  ))

如果您有很多不同的termCodes ,最好利用重復的結構並執行類似的操作,將所有日期放在一個表中,將其連接到您的主要數據,然后您可以使用更簡潔的代碼得到你的結果。 這應該非常快,因為連接非常有效,然后您只需要做一個矢量化計算。

library(lubridate)

lookup_table <- tribble(
  ~termCode, ~Early, ~Mid,
  "SP1", 20200131, 20200308,
  "SP2", 20200331, 20200605,
  "SP3", 20200424, 20200531) %>%
  mutate(across(Early:Mid, ymd))  #lubridate::ymd

tttotalCam2020 %>%
  left_join(lookup_table) %>%
  mutate(COURSE_PERIOD = case_when(
    viewTime <= Early ~ "Early",
    viewTime <= Mid ~ "Mid",
    TRUE ~ "Late"
  ))

我認為您正在尋找mapply() function。

https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/mapply

使用mapply()您可以定義一個具有多個輸入值(例如列中的條件)的 function 並在不需要 for 循環的情況下運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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