首页 > 解决方案 > R:对于第 [i] 行中的新变量,比较列 x 和 y 中的行综合

问题描述

我正在寻找类似 for 循环的代码,它查看某些列的所有行以为行 [i] 创建一个新变量。

我有一个数据框,它基本上包括三列。间隔开始、间隔结束和测量日期。在所有三列中,值的格式为 YearMonthDayHourMinute。测量日期连续 10 分钟。间隔只是很短的时间段,会留下很多不符合测量日期的 NA。

数据框如下所示:

interval_start interval_end measuring_date
1             NA           NA   201805021210
2   201805021220 201805021250   201805021220
3             NA           NA   201805021230
4             NA           NA   201805021240
5             NA           NA   201805021250
6             NA           NA   201805021300

现在,我想 R 创建一个新列,在测量周期位于区间内时给出“是”,在不在区间内给出“否”。

像这样:

interval_start interval_end measuring_date within_interval
1             NA           NA   201805021210              No
2   201805021220 201805021250   201805021220             Yes
3             NA           NA   201805021230             Yes
4             NA           NA   201805021240             Yes
5             NA           NA   201805021250             Yes
6             NA           NA   201805021300              No

所以我希望R获取第1行的measurement_date并将其与第1、2、3、4、5和6行的interval_start和interval_end进行比较。第2行的measurement_date也是如此,依此类推。我现在遇到的问题是我已经尝试使用 if else 和嵌套 for 循环(见下文)进行 for 循环,但 R 似乎无法获取第 1 行的测量日期并将其与所有行进行比较 interval_start 和 interval_end . 它仅在同一行内进行比较。所以我能得到的是:

interval_start interval_end measuring_date within_interval
1             NA           NA   201805021210              No
2   201805021220 201805021250   201805021220             Yes
3             NA           NA   201805021230              No
4             NA           NA   201805021240              No
5             NA           NA   201805021250              No
6             NA           NA   201805021300              No

有谁知道这个问题的解决方案?也许在 for 循环之外还有一些我没有遇到的解决方案。我一直在搜索整个互联网,但没有找到任何让我非常沮丧的解决方案。连我的主管都无奈..希望我的问题够清楚,抱歉,我是第一次使用stackoverflow..

for (i in 1:nrow(masterX)){ 

  masterX$Within_Searching_Period[i] <- NA 

  for (j in 1:nrow(masterX)){

    if (masterX$MESS_DATUM[i] >= masterX$time_date_start_min[j] & 
        masterX$MESS_DATUM[i] <= masterX$time_date_end_min[j]) {

      masterX$Within_Searching_Period[i] <- "YES"

    } else {masterX$Within_Searching_Period[i] <- "NO"

    }

  }
}

标签: rdataframefor-loop

解决方案


使用data.table包,您可以使用 non-equi 连接来查找 measure_date 是否在任何间隔内:

DT[, within_interval := 
    DT[DT, .N > 0 ,on=.(interval_start <= measuring_date, interval_end >= measuring_date), by=.EACHI]$V1
]

输出:

        interval_start        interval_end      measuring_date within_interval
1:                <NA>                <NA> 2018-05-02 12:10:00           FALSE
2: 2018-05-02 12:20:00 2018-05-02 12:50:00 2018-05-02 12:20:00            TRUE
3:                <NA>                <NA> 2018-05-02 12:30:00            TRUE
4:                <NA>                <NA> 2018-05-02 12:40:00            TRUE
5:                <NA>                <NA> 2018-05-02 12:50:00            TRUE
6:                <NA>                <NA> 2018-05-02 13:00:00           FALSE

数据:

library(data.table)
DT <- fread("interval_start,interval_end,measuring_date
NA,NA,201805021210
201805021220,201805021250,201805021220
NA,NA,201805021230
NA,NA,201805021240
NA,NA,201805021250
NA,NA,201805021300", colClasses="character")
DT[, (names(DT)) := lapply(.SD, as.POSIXct, format="%Y%m%d%H%M")]

推荐阅读