R,Union两个数据帧具有不同的列名并且不匹配

cyb*_*101 3 r dataframe

我想将R中的两个不同的数据帧(完全不同的列)组合成一个包含数据帧.

让我们说数据框"df_a"有A列和B列:

df_a <- read.table(header=TRUE, text='
    A   B
    1   x1
    2   y1
    3   z1
')
Run Code Online (Sandbox Code Playgroud)

数据框"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
')
Run Code Online (Sandbox Code Playgroud)

因此,结果数据帧"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
Run Code Online (Sandbox Code Playgroud)

方法#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
Run Code Online (Sandbox Code Playgroud)

方法#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
Run Code Online (Sandbox Code Playgroud)

方法#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)
Run Code Online (Sandbox Code Playgroud)

但是,我收到了这个错误:

data.frame(...,check.names = FALSE)中的错误:参数意味着行数不同:0,3

如何实现将2个数据帧与非匹配列组合成单个数据帧的任务?

谢谢

jer*_*ycg 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)
Run Code Online (Sandbox Code Playgroud)

  • 或者在合并调用中使用`"row.names"` - `merge(df_a,df_b,by ="row.names",all = TRUE)` (2认同)

Mic*_*ico 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
Run Code Online (Sandbox Code Playgroud)

(基本上,我们找到要合并的东西,即行号,然后合并)