Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于数据帧名称计算多个数据帧上的年龄_R_Date_Dataframe - Fatal编程技术网

R 基于数据帧名称计算多个数据帧上的年龄

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