Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用在R中循环数据帧的多个条件对for循环进行矢量化_R_Dataframe_Loops_Vectorization - Fatal编程技术网

使用在R中循环数据帧的多个条件对for循环进行矢量化

使用在R中循环数据帧的多个条件对for循环进行矢量化,r,dataframe,loops,vectorization,R,Dataframe,Loops,Vectorization,我有一个700万行的大型数据集,我正在尝试遍历数据帧的每一行,并根据一组条件更改列中的值 这需要花费很多时间,我想知道是否有可能将过程矢量化,或者是否有更高效、更快的方法来实现这一点。我用的是R码 我的代码如下: for(row in 1:nrow(tttotalCam2020)){ viewTime <- tttotalCam2020[row, "DAY_DATE"] termCode <- tttotalCam2020[row, "TERM_

我有一个700万行的大型数据集,我正在尝试遍历数据帧的每一行,并根据一组条件更改列中的值

这需要花费很多时间,我想知道是否有可能将过程矢量化,或者是否有更高效、更快的方法来实现这一点。我用的是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'
    }
for(第1行:nrow(tttotalCam2020)){

viewTime我想您正在寻找
mapply()
函数


使用
mapply()
您可以使用多个输入值(例如列中的条件)定义一个函数,并在不需要for循环的情况下运行它。

如果您可以共享我们可以测试的示例数据,将更容易提供帮助


dplyr::case\u当
解决方案可能如下所示:

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.
  ))
dplyr::case\u when()
是矢量化的,有助于生成可读的代码。为了更快地转换
数据。table
包提供了解决方案
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"
  ))