R - 将三个数据帧的列表合并为单个数据帧,其中ID在第一列中,接下来的三列显示值

Pep*_*tch 0 r dataframe

这是我的数据框列表:

[[1]]
ID   Value
A   1
B   1
C   1

[[2]]
ID   Value
A   1
D   1
E   1

[[3]]
ID   Value
B   1
C   1
Run Code Online (Sandbox Code Playgroud)

我在左侧列中具有唯一(非冗余)ID的单个数据帧之后,在列中复制,并将NULL值设置为0:

ID   [1]Value   [2]Value   [3]Value  
A    1          1          0
B    1          0          1
C    1          0          1
D    0          1          0
E    0          1          0
Run Code Online (Sandbox Code Playgroud)

我试过了:

Reduce(function(x, y) merge(x, y, by=ID), datahere)

这提供了单个列表,但不考虑原始值的来源,并且在新行中重复重复的ID.

rbindlist(datahere, use.names=TRUE, fill=TRUE, idcol="Replicate")
Run Code Online (Sandbox Code Playgroud)

这提供了一个单独的列表,其中[x]值编号作为一个名为Replicate的新列,但它仍然不在我想要的结构中,因为ID列有冗余.

Mau*_*ers 6

使用dplyr/ 这样的事情怎么样purrr:

require(tidyverse);
reduce(lst, full_join, by = "ID");
#   ID Value.x Value.y Value
# 1  A       1       1    NA
# 2  B       1      NA     1
# 3  C       1      NA     1
# 4  D      NA       1    NA
# 5  E      NA       1    NA
Run Code Online (Sandbox Code Playgroud)

或者将NAs替换为0s:

reduce(lst, full_join, by = "ID") %>% replace(., is.na(.), 0);
#  ID Value.x Value.y Value
#1  A       1       1     0
#2  B       1       0     1
#3  C       1       0     1
#4  D       0       1     0
#5  E       0       1     0
Run Code Online (Sandbox Code Playgroud)

样本数据

options(stringsAsFactors = FALSE);
lst <- list(
    data.frame(ID = c("A", "B", "C"), Value = c(1, 1, 1)),
    data.frame(ID = c("A", "D", "E"), Value = c(1, 1, 1)),
    data.frame(ID = c("B", "C"), Value = c(1, 1)))
Run Code Online (Sandbox Code Playgroud)