For Loops R:将 grep(pattern) 的结果输入到 R 中多列的 For 循环中
For Loops R: Feed result from grep(pattern) into For loop for multiple columns in R
我想用某些(异步)日期(120+)的 labvalues 进行计算。但是,Lubridate 不允许在同一列中同时使用 ymd 和 ymd_hms。因此,我写了一个工作 grep 来查找没有时间的日期,并在后面添加 00:00:00 。因此,即 01-12-1998 变为 01-12-1998 00:00(基于此查询:)
现在想做一个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(模式),其中 returns 实验室日期的编号,即 2:4。这个结果可以用上面的函数输入到 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")
}
您可以使用 lubridate
中的 parse_date_time
来更改不同格式的日期时间。
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))
我们可以使用anytime
library(anytime)
library(dplyr)
addFormats('%d/%m/%Y')
Testset %>%
mutate(across(starts_with('Lab_date'), anytime))
# ID Lab_date1 Lab_date2 Lab_date3 Lab_date4
#1 76 1982-01-18 1990-01-26 1990-06-20 1990-11-15
#2 183 1982-10-18 1989-04-24 1989-04-27 1991-04-02
#3 27 1983-01-11 1982-10-18 1983-04-13 1984-10-31
#4 84 1983-01-12 1983-01-12 1983-04-21 1984-03-22
#5 28 1989-10-13 1989-01-13 1991-11-13 1991-11-19
#6 120 1982-01-10 1982-07-14 1986-08-26 1986-08-26
我想用某些(异步)日期(120+)的 labvalues 进行计算。但是,Lubridate 不允许在同一列中同时使用 ymd 和 ymd_hms。因此,我写了一个工作 grep 来查找没有时间的日期,并在后面添加 00:00:00 。因此,即 01-12-1998 变为 01-12-1998 00:00(基于此查询:
现在想做一个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(模式),其中 returns 实验室日期的编号,即 2:4。这个结果可以用上面的函数输入到 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")
}
您可以使用 lubridate
中的 parse_date_time
来更改不同格式的日期时间。
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))
我们可以使用anytime
library(anytime)
library(dplyr)
addFormats('%d/%m/%Y')
Testset %>%
mutate(across(starts_with('Lab_date'), anytime))
# ID Lab_date1 Lab_date2 Lab_date3 Lab_date4
#1 76 1982-01-18 1990-01-26 1990-06-20 1990-11-15
#2 183 1982-10-18 1989-04-24 1989-04-27 1991-04-02
#3 27 1983-01-11 1982-10-18 1983-04-13 1984-10-31
#4 84 1983-01-12 1983-01-12 1983-04-21 1984-03-22
#5 28 1989-10-13 1989-01-13 1991-11-13 1991-11-19
#6 120 1982-01-10 1982-07-14 1986-08-26 1986-08-26