r - For Loops R:将来自 grep(pattern) 的结果输入到 For 循环中,用于 R 中的多列
问题描述
我想用某些(异步)日期(120+)的实验室值进行计算。但是,Lubridate 不允许 ymd 和 ymd_hms 在同一列中。因此,我编写了一个工作 grep 来查找没有时间的日期,并在其后面添加 00:00:00。因此,即 01-12-1998 变为 01-12-1998 00:00 (基于此查询:lubridate 转换午夜时间戳返回 NA:如何填充缺少的时间戳)
现在我想制作一个自动识别合格列(将来可能会改变)的 Forloop,并执行时间加法功能。
我找不到将以下所有功能联系在一起的正确文档。很想知道在哪里可以找到有关此的更多信息!
Data frame: Testset
ID Lab_date1 Lab_date2 Lab_date3 Lab_date4
76 18/1/1982 26/01/1990 20/06/1990 15/11/1990
183 18/10/1982 24/04/1989 27/04/1989 02/04/1991
27 1/11/1983 18/10/1982 01:01 13/04/1983 31/10/1984
84 12-1-1983 12-1-1983 00:00 21-4-1983 15:10 22-3-1984 00:00
28 13-10-1989 13-1-1989 12:00 13-11-1991 14:11 19-11-1991 00:00
120 1-10-1982 14-7-1982 00:00 26-8-1986 00:00 26-8-1986 00:00
更改日期的函数现在为 Lab_date1 编程
Testset$Lab_date1[grep("[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$",Testset$Lab_date1)] <- paste(
Testset$Lab_date1[grep("[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$",Testset$Lab_date1)],"00:00:00")
另外,我写了一个 grep(模式),它返回实验室日期的列号,即 2:4。这个结果可以用上面的函数输入到 aa forloop 中吗?
dat_lab <- grep(pattern="Lab_date",
x=colnames(Testset))
我已经尝试过了,但是没有用
for(i in names(dat_lab)){
y <- dat_lab[i]
y[grep("[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$",y)] <- paste(
y[grep("[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$",y)],"00:00:00")
}
解决方案
您可以使用parse_date_time
fromlubridate
以不同的格式更改日期时间。
library(dplyr)
Testset %>%
mutate(across(starts_with('Lab_date'),
lubridate::parse_date_time, c('dmY', 'dmY HM'))) -> Testset
Testset
# ID Lab_date1 Lab_date2 Lab_date3 Lab_date4
#1 76 1982-01-18 1990-01-26 00:00:00 1990-06-20 00:00:00 1990-11-15
#2 183 1982-10-18 1989-04-24 00:00:00 1989-04-27 00:00:00 1991-04-02
#3 27 1983-11-01 1982-10-18 01:01:00 1983-04-13 00:00:00 1984-10-31
#4 84 1983-01-12 1983-01-12 00:00:00 1983-04-21 15:10:00 1984-03-22
#5 28 1989-10-13 1989-01-13 12:00:00 1991-11-13 14:11:00 1991-11-19
#6 120 1982-10-01 1982-07-14 00:00:00 1986-08-26 00:00:00 1986-08-26
数据
Testset <- structure(list(ID = c(76L, 183L, 27L, 84L, 28L, 120L), Lab_date1 = c("18/1/1982",
"18/10/1982", "1/11/1983", "12-1-1983", "13-10-1989", "1-10-1982"
), Lab_date2 = c("26/01/1990", "24/04/1989", "18/10/1982 01:01",
"12-1-1983 00:00", "13-1-1989 12:00", "14-7-1982 00:00"), Lab_date3 = c("20/06/1990",
"27/04/1989", "13/04/1983", "21-4-1983 15:10", "13-11-1991 14:11",
"26-8-1986 00:00"), Lab_date4 = c("15/11/1990", "02/04/1991",
"31/10/1984", "22-3-1984 00:00", "19-11-1991 00:00", "26-8-1986 00:00"
)), class = "data.frame", row.names = c(NA, -6L))
推荐阅读
- python - Python Regex 查找不完整的左括号和右括号
- nativescript - Nativescript 插件“nativescript-camera-plus”:无法设置图片大小(宽度和高度)
- c++ - 在数组 dna 中的每个对象中获取相同的字符串(基因数组)(动态分配)
- react-native - React Navigation:有条件的主导航器
- python - 无法使用 OS.system 从 python 运行可执行文件
- html - 尝试获取嵌入式网络链接或 iframe 以显示另一个网站
- mysql - 在存储过程中使用循环增量创建表
- forms - 如何在 Symfony 4 表单上的多个复选框周围添加包装器
- php - 如何使用 laravel eloquent 查询用户并将他们分组在年龄范围内
- javascript - 打开图层,停用 ol.control.Toggle 并激活另一个