【问题标题】:R, Union two dataframe with different column names and no matchR,联合两个具有不同列名且不匹配的数据框
【发布时间】: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 &lt;- 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 &lt;- 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

标签: r dataframe


【解决方案1】:

似乎您正在尝试做一些可能不推荐的事情,但这是我在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】:

    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)
    

    【讨论】:

    • 或者只是在合并调用中使用"row.names" - merge(df_a,df_b,by="row.names",all=TRUE)
    • 我选择了这个答案,因为它使用了基础包并且有效,谢谢
    【解决方案3】:

    我们可以使用dplyr 中的add_rownames 在每个数据集中创建一个行名列,然后执行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
    

    【讨论】:

      猜你喜欢
      • 2020-03-05
      • 1970-01-01
      • 2020-03-23
      • 2021-11-30
      • 2021-01-16
      • 2017-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      相关资源
      最近更新 更多