r - 用嵌套的 lapply 解析
问题描述
我有一个包含日期的多个变量的 df。在这些变量中,一些报告由格式符号分隔的多个日期。对于每个相关变量中的每个单元格,我想拆分字符串,重新格式化为数据,然后选择最后一个日期。
数据
data <- data.frame(ex=c(1,2),date_1 = c("30/12/1997\n22/12/1998","15/12/1993"), date_2 = c("21/03/1997\n11/04/1996\n11/04/1996\n11/04/1996\n11/04/1996",NA))
expected <- data.frame(ex=c(1,2),date_1 = c("1998-12-22","1993-12-15"), date_2 = c("1997-03-21",NA))
代码尝试 (1)错误:所有条目都获得 VAR 最大值而不是单元格最大值
data[grep("date",names(data),value = T)] <- lapply(data[grep("date",names(data),value = T)], function(x) max(as.Date(str_split(x,"\n")[[1]],format="%d/%m/%Y"), na.rm = T))
代码尝试 (2)(嵌套 LAPPLY)错误:代码在某处中断
data[grep("date",names(data),value = T)] <- lapply(data[grep("date",names(data),value = T)], function(y) max(y, lapply(data[grep("date",names(data),value = T)], function(x)
as.Date(str_split(x,"\n")[[1]],format="%d/%m/%Y"), na.rm = T)))
代码尝试 (3)(嵌套 LAPPLY)错误:代码在某处中断
data[grep("date",names(data),value = T)] <- lapply(data[grep("date",names(data),value = T)], function(y) max(y,function(x) as.Date(str_split(x,"\n")[[1]],format="%d/%m/%Y"), na.rm = T))
解决方案
我们可以用 :
data[-1] <- lapply(data[-1], function(y) sapply(strsplit(y ,"\n"),
function(x) max(as.Date(x, "%d/%m/%Y"))))
data[-1] <- lapply(data[-1], as.Date)
data
# ex date_1 date_2
#1 1 1998-12-22 1997-03-21
#2 2 1993-12-15 <NA>
逻辑与对每一列(除了第一列)描述的逻辑相同,我们将字符串拆分为"\n"
,转换为日期并返回max
值。内部sapply
循环返回日期的数字表示,因此我们使用另一个lapply
将数字转换为日期。
推荐阅读
- c++ - 在非转发引用类型模板参数上使用 std::forward 的后果和替代方法
- python - 我如何在已部署的应用程序(heroku)上使用 browser_cookie3
- postgresql - 哪些 Postgres 13 索引类型支持距离搜索?
- audio - 如何在较长的音频文件中找到一些声音样本
- javascript - javascript幻灯片有时会搞砸
- r - 定义列组并使用 dplyr 对每个组的所有第 i 列求和
- java - 以矩形为容器更改图像图案的色调比例
- mongodb - 值的大小会影响 MongoDB 中索引的大小吗?
- css - 网站设计-半透明浅色背景
- python - Tensorflow 模型每 x 个 epoch 显示一次输出