我想将R中的两个不同的数据帧(完全不同的列)组合成一个包含数据帧。
让我们说数据框" df_a"列A& B:
df_a <- read.table(header=TRUE, text='
A B
1 x1
2 y1
3 z1
')
和dataframe&#34; df_b&#34;有专栏C&amp; 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
')
因此得到的数据帧&#34; df_c&#34;将有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
方法#1:
我首先尝试使用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个数据帧与非匹配列组合成单个数据帧的任务?
由于
答案 0 :(得分:6)
R将相同行上的变量视为相关行,因此它不希望将事物放在同一行,除非它被告知你想要它们。一般来说,这是为了防止错误。如果您知道自己在做什么,可以通过以下方式手动提供要合并的ID:
df_a$row <- 1:nrow(df_a)
df_b$row <- 1:nrow(df_b)
merge(df_a, df_b, by = "row", all = TRUE)
答案 1 :(得分:5)
好像你正在尝试做一些可能不推荐的事情,但这就是我在data.table
做的事情:
library(data.table) #1.9.5+ to get the on argument to [.data.table
setDT(df_a,keep.rownames=T); setDT(df_b,keep.rownames=T)
> df_a[df_b,on="rn"]
rn A B C D
1: 1 1 x1 1 6.7
2: 2 2 y1 1 4.5
3: 3 3 z1 1 3.7
4: 4 NA NA 2 3.3
5: 5 NA NA 2 4.1
6: 6 NA NA 2 5.2
(基本上,我们找到要合并的东西,即行号,然后合并)
答案 2 :(得分:2)
我们可以使用add_rownames
中的dplyr
在每个数据集中创建行名称列,然后执行full_join/left_join
library(dplyr)
full_join(add_rownames(df_a) , add_rownames(df_b), by='rowname') %>%
select(-rowname)
# 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