【问题标题】:Convert Data frame with different date in list table into single dataframe using R使用R将列表表中具有不同日期的数据框转换为单个数据框
【发布时间】:2018-03-12 05:21:40
【问题描述】:

我想将列表中的表格制作成单个数据框。我这里有数据

datex <- c("2018/01/01","2018/01/02","2018/01/03")
x1 <- c(101,102,103); varx1 <- data.frame(x1,datex)
datex <- c("2018/01/01","2018/01/02","2018/01/03","2018/01/04","2018/01/05")
x2 <- c(10,11,12,13,14); varx2 <- data.frame(x2,datex)
datex <- c("2018/01/01")
x3 <- c(1000); varx3 <- data.frame(x3,datex)
combination <- list(varx1,varx2,varx3)
combination

我想要这样的结果为“NULL”或“NA”

datex <- c("2018/01/01","2018/01/02","2018/01/03","2018/01/04","2018/01/05")
x1 <- c(101,102,103,"NULL","NULL")
x2 <- c(10,11,12,13,14)
x3 <- c(1000,"NULL","NULL","NULL","NULL")
answer <- data.frame(datex, x1,x2,x3)
answer

需要帮助!

【问题讨论】:

    标签: r dplyr data.table reshape reshape2


    【解决方案1】:

    我们可以将Reduce 与来自base Rmerge 一起使用。缺失值将是 NA 而不是 NULL

    Reduce(function(...) merge(..., by = 'datex', all = TRUE), combination)
    #       datex  x1 x2   x3
    #1 2018/01/01 101 10 1000
    #2 2018/01/02 102 11   NA
    #3 2018/01/03 103 12   NA
    #4 2018/01/04  NA 13   NA
    #5 2018/01/05  NA 14   NA
    

    tidyverse 的类似选项是

    library(tidyverse)
    combination %>%
          reduce(full_join, by = 'datex') %>%
          select(datex, everything())
    #      datex  x1 x2   x3
    #1 2018/01/01 101 10 1000
    #2 2018/01/02 102 11   NA
    #3 2018/01/03 103 12   NA
    #4 2018/01/04  NA 13   NA
    #5 2018/01/05  NA 14   NA
    

    如果我们真的需要NULL,可以放在list内(不推荐)

    combination %>%
          reduce(full_join, by = 'datex') %>%
          select(datex, everything()) %>%
          mutate_at(vars(matches('x\\d+')), funs(replace(., is.na(.), list(NULL))))
    #    datex   x1 x2   x3
    #1 2018/01/01  101 10 1000    
    #2 2018/01/02  102 11 NULL
    #3 2018/01/03  103 12 NULL
    #4 2018/01/04 NULL 13 NULL
    #5 2018/01/05 NULL 14 NULL
    

    【讨论】:

    • 它可以,但是如果想使用“NULL”更通用,我应该怎么做?
    • @CarolusMardisonPurba 我建议不要使用 NULL,因为您无法存储在数据集中。虽然可以在list 中完成
    • 没问题。请注意,由于 NULL,列现在是列表。否则,您可能需要转换为character,然后列的类将是字符即。 funs(replace(., is.na(.), "NULL")))
    • 您好,先生,我遇到了问题。我使用 100 个 x 变量(x1、x2、x3、...、x100)。我收到消息:UseMethod("tbl_vars") 中的错误:没有适用于“tbl_vars”的方法应用于“NULL”类的对象。你能帮帮我吗?
    • @CarolusMardisonPurba 这就是我告诉你不要使用"NULL"的原因NA有什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2020-05-31
    • 2020-07-14
    • 1970-01-01
    • 2017-12-30
    • 2015-11-14
    相关资源
    最近更新 更多