r - 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"
}
}
}
解决方案
使用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")]
推荐阅读
- javascript - 使用 DataTables 在服务器端模式下具有单独搜索输入的多个表
- html - 如何使用 [ngClass] 或 customClass 更改 tabset nav-pills 背景颜色
- html - 如何从 HTML 执行 jar 文件?
- c# - 如何使用 MediaPlayerElement 将 ui 同步到全屏或紧凑模式
- sql-server - SQL Server - 在“async_network_io”状态下查询取消
- ios - Firebase子查询在删除一个键然后添加回来后出现零
- python - 使用 Python Pandas 将(美国)负数转换为 -Europeans
- node.js - 如何从 REACT JS 获取 JSON 以在 NODE js 中实现
- django - 我的两个自定义用户模型不能登录失败
- postgresql - 我不能在 PostgreSQL 中以参数方式从 current_date 中减去天数