首页 > 解决方案 > 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")
}

标签: rloopsfor-looplubridate

解决方案


您可以使用parse_date_timefromlubridate以不同的格式更改日期时间。

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))

推荐阅读