如何通过列中名称的第一部分合并两个data.frames?

时间:2016-02-29 08:30:18

标签: r

我有两个文本文件: F1

    A   B
   sam 23
   dam  90

F2

      G  A  K
  43 DQF_df_gf 65
  54 sam_df_bnol 90
  56 jay_df_nkol 89
  67 dam_df_etr 43
  45 fds_df_lpko 78

正如你在这里看到的那样,我在f1 $ A中有两个名字,我想用它来代表m2和f2。问题是他们只与f2 $ A共享第一部分。 使用:

            gh=merge(f1,f2,by="A",all=TRUE)

不会给出错误但是NA

期望的输出:

        A   B    G    K
     sam 23   54   90
     dam  90  67   43

2 个答案:

答案 0 :(得分:2)

您必须提取列的第一部分" A"在f2中,以便您可以使用它来合并。如果您想在包含合并的一个步骤中执行此操作,则可以使用:

merge(f1, transform(f2, A = sub("^([^_]+).*", "\\1", A)), by = "A")
#    A  B  G  K
#1 dam 90 67 43
#2 sam 23 54 90

这并不需要向f2添加新列。它只会更改f2后丢失的merge副本,即f2保持不变。

你可以看到我在合并中进行了这次提取:

transform(f2, A = sub("^([^_]+).*", "\\1", A))
#   G   A  K
#1 43 DQF 65
#2 54 sam 90
#3 56 jay 89
#4 67 dam 43
#5 45 fds 78

另一项检查:

x <- c("KR.S._",  "SS#2_")
sub("^([^_]+).*", "\\1", x)
#[1] "KR.S." "SS#2" 

使用的样本数据:

f1 <- structure(list(A = structure(c(2L, 1L), .Label = c("dam", "sam"
), class = "factor"), B = c(23L, 90L)), .Names = c("A", "B"), class = "data.frame", row.names = c(NA, 
-2L))

f2 <- structure(list(G = c(43L, 54L, 56L, 67L, 45L), A = structure(c(2L, 
5L, 4L, 1L, 3L), .Label = c("dam_df_etr", "DQF_df_gf", "fds_df_lpko", 
"jay_df_nkol", "sam_df_bnol"), class = "factor"), K = c(65L, 
90L, 89L, 43L, 78L)), .Names = c("G", "A", "K"), class = "data.frame", row.names = c(NA, 
-5L))

答案 1 :(得分:1)

您可以使用merge()来实现您的目标,但不是使用df2,而是可以将df1数据框与包含f2的数据框合并使用临时列进行合并:

gh <- merge(f1,
            cbind(f2, merge=gsub('^(.*?)_.*', '\\1', f2$A)),
            by.x=c("A"),
            by.y=c("merge"))

> gh
    A  B  G           A  K
1 dam 90 67  dam_df_etr 43
2 sam 23 54 sam_df_bnol 90