如何合并没有公共列的两个数据框

时间:2018-10-09 17:56:26

标签: r

我想合并2个没有通用列的数据框。实际上,这2个数据框具有相同的命名列,但此列中的变量名称几乎没有不同。所以我不能合并它们。

代码示例:

df_1 <- data.frame(gene = c("a1.1", "a2.2"), df_1_value = c("12", "13"))
df_2 <- data.frame(gene = c("a1", "a2"), df_2_value = c("153", "461"))

我想得到:

    gene                                                   df_1_value       df_2_value
  a1.1 or a1 (it doesnt matter, both of two is same)              12              153
  a2.2 or a2                                                      13              461

我尝试:

df22 <- df_2 %
   select(df_2_value)

merge(df_1, df_22) 

输出:

gene                   df_1_value                       df_2_value 
a1.1                      12                                153
a2.2                      13                                153
a1.1                      12                                461
a2.2                      13                                461 

2 个答案:

答案 0 :(得分:0)

1。如果行完全匹配:

cbind(df_1, "df_2_value" = df_2[, 2])
  gene df_1_value df_2_value
1 a1.1         12        153
2 a2.2         13        461

2。如果您的数据不完整

如果df_2_value对于所有行都不存在,反之亦然。

df_1$gene <- substr(df_1$gene, 1, 2)    # Clean up "gene" column
library(dplyr)
full_join(df_1, df_2, "gene")  

  gene df_1_value df_2_value
1   a1         12           
2   a2         13        461

数据

df_1 <- data.frame(gene = c("a1.1", "a2.2"), df_1_value = c("12", "13"), stringsAsFactors = FALSE)
df_2 <- data.frame(gene = c("a1", "a2"), df_2_value = c("", "461"), stringsAsFactors = FALSE)

答案 1 :(得分:0)

如果在两种gene格式之间进行转换的方法很明确,则可以尝试使用此技术将这个问题转换为“按列”方法(例如“模糊”方法):

df_1$genemod <- gsub("\\..*", "", df_1$gene)
merge(df_1, df_2, by.x="genemod", by.y="gene")
#   genemod gene df_1_value df_2_value
# 1      a1 a1.1         12        153
# 2      a2 a2.2         13        461

(您可以在其中轻松删除或重命名genegenemod任一列)