R、 合并两个列名称不同且不匹配的数据帧

R、 合并两个列名称不同且不匹配的数据帧,r,dataframe,R,Dataframe,我想将R中两个不同的数据帧(完全不同的列)组合成一个包含性数据帧 假设数据帧“df_a”有a列和B列: df_a <- read.table(header=TRUE, text=' A B 1 x1 2 y1 3 z1 ') 方法#1: 我第一次尝试使用rbind(),但该函数需要匹配的列名,但这不是我想要的 方法#2: 我使用了df_c似乎您正在尝试做一些可能不推荐的事情,但下面是我在数据中要做的事情。表: library(data.ta

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

假设数据帧“df_a”有a列和B列:

df_a <- read.table(header=TRUE, text='
    A   B
    1   x1
    2   y1
    3   z1
')
方法#1:

我第一次尝试使用
rbind()
,但该函数需要匹配的列名,但这不是我想要的

方法#2:


我使用了
df_c似乎您正在尝试做一些可能不推荐的事情,但下面是我在
数据中要做的事情。表

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

(基本上,我们找到要合并的内容,即行号,然后在此基础上进行合并)

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)

df_a$row我们可以使用
add_rownames
from
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
库(dplyr)
完全联接(通过class='rowname')%>%
选择(-rowname)
#A、B、C、D
#1x16.7
#2 2 y1 14.5
#3 3 z1 1 3.7
#4 NA 2 3.3
#5 NA 2 4.1
#6 NA 2 5.2

因此,即使行数不同,也无法将
df_a
中的行与
df_b
中的行进行匹配?这是另一个cbind.fill问题,其中一个问题是今天早些时候提出的,并作为该问题的许多其他版本之一的副本关闭。只需google cbind.fill或只需在合并调用中使用
“row.names”
合并(df_a,df_b,by=“row.names”,all=TRUE)
我选择这个答案是因为它使用了基本包,而且很有效,谢谢
[[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
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)
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
df_a$row <- 1:nrow(df_a)
df_b$row <- 1:nrow(df_b)
merge(df_a, df_b, by = "row", all = TRUE)
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