使用 R 将列表 table 中具有不同日期的数据框转换为单个数据框
Convert Data frame with different date in list table into single dataframe using R
我想将列表中的 table 变成单个数据框。我这里有数据
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
需要帮助!
我们可以使用 Reduce
和 base R
中的 merge
。缺失值将是 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
我想将列表中的 table 变成单个数据框。我这里有数据
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
需要帮助!
我们可以使用 Reduce
和 base R
中的 merge
。缺失值将是 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