我有两个文本文件: 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
答案 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