我正在尝试相邻显示多个数据帧以比较某些条目。但是,它们的行数不同,我希望每个数据框的顺序完全相同。我尝试使用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 的顺序应该保持不变。任何帮助将不胜感激!
基本 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)
编辑:如果有多个df. 做这个
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)
| 归档时间: |
|
| 查看次数: |
969 次 |
| 最近记录: |