【发布时间】:2015-11-10 18:40:12
【问题描述】:
我想将 R 中的两个不同的数据帧(完全不同的列)组合成一个包容性数据帧。
假设数据框“df_a”有 A 列和 B 列:
df_a <- read.table(header=TRUE, text='
A B
1 x1
2 y1
3 z1
')
并且数据框“df_b”具有列 C 和 D。
df_b <- read.table(header=TRUE, text='
C D
1 6.7
1 4.5
1 3.7
2 3.3
2 4.1
2 5.2
')
因此,生成的数据框“df_c”将包含 A、B、C、D 列,见下文:
df_c
A B C D
1 1 x1 1 6.7
2 2 y1 1 4.5
3 3 z1 1 3.7
4 NA NA 2 3.3
5 NA NA 2 4.1
6 NA NA 2 5.2
方法一:
我第一次尝试使用 rbind(),但该函数需要匹配列名,但这不是我想要的。
方法 #2:
我使用了df_c <- merge(df_a,df_b),但合并似乎是在做笛卡尔积,见下文:
df_c <- merge(df_a,df_b)
df_c
A B C D
1 1 x1 1 6.7
2 2 y1 1 6.7
3 3 z1 1 6.7
4 1 x1 1 4.5
5 2 y1 1 4.5
6 3 z1 1 4.5
7 1 x1 1 3.7
8 2 y1 1 3.7
9 3 z1 1 3.7
10 1 x1 2 3.3
11 2 y1 2 3.3
12 3 z1 2 3.3
13 1 x1 2 4.1
14 2 y1 2 4.1
15 3 z1 2 4.1
16 1 x1 2 5.2
17 2 y1 2 5.2
18 3 z1 2 5.2
方法 #3:
比我用df_c <- union(df_a,df_b),但结果不再是数据框。它变成了一个列表列表,见下文:
[[1]]
[1] 1 2 3
[[2]]
[1] x1 y1 z1
Levels: x1 y1 z1
[[3]]
[1] 1 1 1 2 2 2
[[4]]
[1] 6.7 4.5 3.7 3.3 4.1 5.2
方法#4
我创建了自己的函数unionNoMatch(),它尝试将列从 df_2 附加到 df_1 输入参数:
unionNoMatch <- function(df_1, df_2)
{
df_3 <- df_1;
for (name in names(df_2))
{
cbind(df_2$name,df_3)
}
return (df_3);
}
df_c <- unionNoMatch (df_a,df_b)
但是,我收到了这个错误:
data.frame 中的错误(...,check.names = FALSE): 参数暗示不同的行数:0, 3
我怎样才能完成将 2 个数据框与不匹配的列组合成一个数据框的任务?
谢谢
【问题讨论】:
-
所以即使行数不同,您实际上也无法将
df_a中的行与df_b中的行匹配? -
这是另一个 cbind.fill 问题,今天早些时候提出了一个问题,并作为该问题的许多其他版本之一的副本关闭。只需谷歌 cbind.fill