R 基于数据帧名称计算多个数据帧上的年龄
我想知道这里是否有人能帮我提个问题 每月提取数据,并根据提取的日期01-08-2019、01-09-2019、01-10-2019等命名数据框。每个数据框的内容类似于下例:R 基于数据帧名称计算多个数据帧上的年龄,r,date,dataframe,R,Date,Dataframe,我想知道这里是否有人能帮我提个问题 每月提取数据,并根据提取的日期01-08-2019、01-09-2019、01-10-2019等命名数据框。每个数据框的内容类似于下例: 01-09-2019 ID DOB 3 01-07-2019 5 01-06-2019 7 01-05-2019 8 01-09-2019 01-10-2019 ID DOB 2 01-10-2019 5 01-06-2019 8 01-09-2019 9 0
01-09-2019
ID DOB
3 01-07-2019
5 01-06-2019
7 01-05-2019
8 01-09-2019
01-10-2019
ID DOB
2 01-10-2019
5 01-06-2019
8 01-09-2019
9 01-02-2019
随着时间的推移,有更多的数据集被下载
我想根据提取数据的日期计算每个数据集中的人的年龄——因此,本质上,年龄是数据框名称和DOB变量之间的日期差
01-09-2019
ID DOB AGE(months)
3 01-07-2019 2
5 01-06-2019 3
7 01-05-2019 4
8 01-09-2019 0
01-10-2019
ID DOB AGE(months)
2 01-10-2019 0
5 01-06-2019 4
8 01-09-2019 1
9 01-02-2019 8
我想把所有的数据帧放在一个列表中,因为有很多数据帧,然后使用Lappy计算所有数据帧的年龄。如何计算数据帧名称和列之间的差异?这也可以通过Lappy解决,但在本例中,我们也可以使用Map在列表中添加所有数据帧后迭代列表及其名称。在R底
Map(function(x, y) {
x$DOB <- as.Date(x$DOB)
transform(x, age = as.integer(format(as.Date(y), "%m")) -
as.integer(format(x$DOB, "%m")))
}, list_df, names(list_df))
#$`01-09-2019`
# ID DOB age
#1 3 0001-07-20 2
#2 5 0001-06-20 3
#3 7 0001-05-20 4
#4 8 0001-09-20 0
#$`01-10-2019`
# ID DOB age
#1 2 0001-10-20 0
#2 5 0001-06-20 4
#3 8 0001-09-20 1
#4 9 0001-02-20 8
资料
这也可以用Lappy解决,但在本例中,我们也可以使用Map在列表中添加所有数据帧后迭代列表及其名称。在R底
Map(function(x, y) {
x$DOB <- as.Date(x$DOB)
transform(x, age = as.integer(format(as.Date(y), "%m")) -
as.integer(format(x$DOB, "%m")))
}, list_df, names(list_df))
#$`01-09-2019`
# ID DOB age
#1 3 0001-07-20 2
#2 5 0001-06-20 3
#3 7 0001-05-20 4
#4 8 0001-09-20 0
#$`01-10-2019`
# ID DOB age
#1 2 0001-10-20 0
#2 5 0001-06-20 4
#3 8 0001-09-20 1
#4 9 0001-02-20 8
资料
<> P>使用日期和数字作为数据文件名称是不好的做法,考虑前缀与X的日期,如下面在这个基础R解决方案中所示:
df_list <- list(x01_09_2019 = `01-09-2019`, x01_10_2019 = `01-10-2019`)
df_list <- mapply(cbind, "report_date" = names(df_list), df_list, SIMPLIFY = F)
df_list <- lapply(df_list, function(x){
x$report_date <- as.Date(gsub("_", "-", gsub("x", "", x$report_date)), "%d-%m-%Y")
x$Age <- x$report_date - x$DOB
return(x)
}
)
数据:
`01-09-2019` <- structure(list(ID = c(3, 5, 7, 8),
DOB = structure(c(18078, 18048, 18017, 18140), class = "Date")),
class = "data.frame", row.names = c(NA, -4L))
`01-10-2019` <- structure(list(ID = c(2, 5, 8, 9),
DOB = structure(c(18170, 18048, 18140, 17928), class = "Date")),
class = "data.frame", row.names = c(NA, -4L))
<> P>使用日期和数字作为数据文件名称是不好的做法,考虑前缀与X的日期,如下面在这个基础R解决方案中所示:
df_list <- list(x01_09_2019 = `01-09-2019`, x01_10_2019 = `01-10-2019`)
df_list <- mapply(cbind, "report_date" = names(df_list), df_list, SIMPLIFY = F)
df_list <- lapply(df_list, function(x){
x$report_date <- as.Date(gsub("_", "-", gsub("x", "", x$report_date)), "%d-%m-%Y")
x$Age <- x$report_date - x$DOB
return(x)
}
)
数据:
`01-09-2019` <- structure(list(ID = c(3, 5, 7, 8),
DOB = structure(c(18078, 18048, 18017, 18140), class = "Date")),
class = "data.frame", row.names = c(NA, -4L))
`01-10-2019` <- structure(list(ID = c(2, 5, 8, 9),
DOB = structure(c(18170, 18048, 18140, 17928), class = "Date")),
class = "data.frame", row.names = c(NA, -4L))
如果我可以建议一种稍微不同的方法:在计算年龄之前,将列表压缩到单个数据框中可能更有意义。如果您的数据看起来像这样,即它是一个数据帧列表,其中列表元素名称是访问日期: $`01-09-2019` 一个tibble:4x2 身份证日期 1 3 2019-07-01 2 5 2019-06-01 3 7 2019-05-01 4 8 2019-09-01 $`01-10-2019` 一个tibble:4x2 身份证日期 1 2 2019-10-01 2 5 2019-06-01 3 8 2019-09-01 4 9 2019-02-01 您可以首先使用参数.id=date\u调用bind\u rows,将列表转换为数据框,然后以月为单位计算年龄 图书馆管理员 联吡啶酯 tib% mutatedate_extracted=dmydate_extracted, DOB=dmyDOB, 年龄月=月提取日期月提取日期 输出 一个tibble:8x4 日期提取ID日期年龄月份 1 2019-09-01 3 2019-07-01 2 2 2019-09-01 5 2019-06-01 3 3 2019-09-01 7 2019-05-01 4 4 2019-09-01 8 2019-09-01 0 5 2019-10-01 2 2019-10-01 0 6 2019-10-01 5 2019-06-01 4 7 2019-10-01 8 2019-09-01 1 8 2019-10-01 9 2019-02-01 8
如果我可以建议一种稍微不同的方法:在计算年龄之前,将列表压缩到单个数据框中可能更有意义。如果您的数据看起来像这样,即它是一个数据帧列表,其中列表元素名称是访问日期: $`01-09-2019` 一个tibble:4x2 身份证日期 1 3 2019-07-01 2 5 2019-06-01 3 7 2019-05-01 4 8 2019-09-01 $`01-10-2019` 一个tibble:4x2 身份证日期 1 2 2019-10-01 2 5 2019-06-01 3 8 2019-09-01 4 9 2019-02-01 您可以首先使用参数.id=date\u调用bind\u rows,将列表转换为数据框,然后以月为单位计算年龄 图书馆管理员 联吡啶酯 tib% mutatedate_extracted=dmydate_extracted, DOB=dmyDOB, 年龄月=月提取日期月提取日期 输出 一个tibble:8x4 日期提取ID日期年龄月份 1 2019-09-01 3 2019-07-01 2 2 2019-09-01 5 2019-06-01 3 3 2019-09-01 7 2019-05-01 4 4 2019-09-01 8 2019-09-01 0 5 2019-10-01 2 2019-10-01 0 6 2019-10-01 5 2019-06-01 4 7 2019-10-01 8 2019-09-01 1 8 2019-10-01 9 2019-02-01 8