绑定不同长度的数据帧(无cbind,无合并)

Lin*_*pey 5 merge r cbind

我正在尝试相邻显示多个数据帧以比较某些条目。但是,它们的行数不同,我希望每个数据框的顺序完全相同。我尝试使用cbind它,但由于行数不同而不起作用。我曾经merge将两个 dfs 绑定在一起,然后再次合并它们,但是当我这样做时,它们会改变顺序,并且当我总共有超过 5 个 dfs 时,合并两个 dfs 似乎效率很低。

示例:

df <-  data.frame(v=1:5, x=sample(LETTERS[1:5],5))
df 
  v x
1 1 E
2 2 B
3 3 D
4 4 C
5 5 A

df2 <- data.frame(m=7:10, n=sample(LETTERS[6:9],4))
df2
   m n
1  7 G
2  8 I
3  9 F
4 10 H
Run Code Online (Sandbox Code Playgroud)

然后我订购了df2

df2 <- df2[order(df2$m, decreasing = TRUE),]
df2
   m n
4 10 F
3  9 I
2  8 H
1  7 G
Run Code Online (Sandbox Code Playgroud)

预期输出:

  v x m n
1 1 E 10 F
2 2 B 9 I
3 3 D 8 H
4 4 C 7 G
5 5 A NA NA
Run Code Online (Sandbox Code Playgroud)

正如我所说,我有两个以上的 dfs,并且 dfs 的顺序应该保持不变。任何帮助将不胜感激!

Ron*_*hah 5

基本 R 方法:

将数据帧放入列表中,获取具有最大行数的数据帧,将NA' 附加到行数较少的数据中,并且cbind.

list_df <- list(df, df2)
n_r <- seq_len(max(sapply(list_df, nrow)))
result <- do.call(cbind, lapply(list_df, `[`, n_r, ))
result

#  v x  m    n
#1 1 C 10    F
#2 2 B  9    H
#3 3 E  8    G
#4 4 D  7    I
#5 5 A NA <NA>
Run Code Online (Sandbox Code Playgroud)


Ani*_*yal 2

编辑:如果有多个df. 做这个

  • 创建所有 dfs 的列表,除了第一个之外
  • 用于purrr::reduce将所有这些连接在一起
  • df在论证中首先通过.init
df2 <- data.frame(m=7:10, n=sample(LETTERS[6:9],4))
df <-  data.frame(v=1:5, x=sample(LETTERS[1:5],5))
df3 <- data.frame(bb = 101:110, cc = sample(letters, 10))


reduce(list(df2, df3), .init = df %>% mutate(id = row_number()) , ~full_join(.x, .y %>% mutate(id = row_number()), by = "id" )) %>%
  select(-id)

    v    x  m    n  bb cc
1   1    A 10    I 101  u
2   2    C  9    H 102  v
3   3    D  8    G 103  n
4   4    E  7    F 104  w
5   5    B NA <NA> 105  s
6  NA <NA> NA <NA> 106  y
7  NA <NA> NA <NA> 107  g
8  NA <NA> NA <NA> 108  i
9  NA <NA> NA <NA> 109  p
10 NA <NA> NA <NA> 110  h
Run Code Online (Sandbox Code Playgroud)

早期答案:id在 s 中创建一个虚拟列df并使用full_join

full_join(df %>% mutate(id = row_number()), df2 %>% mutate(id = row_number()), by = "id") %>%
  select(-id)

  v x  m    n
1 1 A 10    I
2 2 C  9    H
3 3 D  8    G
4 4 E  7    F
5 5 B NA <NA>
Run Code Online (Sandbox Code Playgroud)

由于随机数种子不同,结果与预期不同


或者在 BaseR 中

merge(transform(df, id = seq_len(nrow(df))), transform(df2, id = seq_len(nrow(df2))), all = T)

  id v x  m    n
1  1 1 A 10    I
2  2 2 C  9    H
3  3 3 D  8    G
4  4 4 E  7    F
5  5 5 B NA <NA>
Run Code Online (Sandbox Code Playgroud)

只需通过子集 [] 即可删除多余的列

merge(transform(df, id = seq_len(nrow(df))), transform(df2, id = seq_len(nrow(df2))), all = T)[-1]

  v x  m    n
1 1 A 10    I
2 2 C  9    H
3 3 D  8    G
4 4 E  7    F
5 5 B NA <NA>
Run Code Online (Sandbox Code Playgroud)