【问题标题】:Parsing with nested lapply用嵌套的 lapply 解析
【发布时间】:2020-04-30 09:43:43
【问题描述】:

我有一个包含日期的多个变量的 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))

【问题讨论】:

    标签: r function date lapply


    【解决方案1】:

    我们可以使用:

    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 将数字转换为日期。

    【讨论】:

    • 谢谢,第一行代码有效(在转换 catacter 中的 cols 之后)。但是,我得到了第二位大炮转换回来的纯数字格式(参见:stackoverflow.com/questions/15659783/…)。我是否使用了一些错误的设置?
    • 它工作,指定这个来源。 data[-1]
    • 在出发前只需调用图书馆(动物园)
    • 哦……真奇怪。它对我有用,但没有指定来源。也许我有一些不同的设置。
    猜你喜欢
    • 2017-11-23
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多