【发布时间】:2016-08-18 03:58:15
【问题描述】:
我正在尝试基于 DF2 在 DF1 中创建索引。在 DF2 中,我有一个名为 ID 的列,我想做的是搜索 DF1$Name,如果它包含来自 DF2$Wine 的值,则将 ID 从 DF2$ID 填充到 DF1$ID。
DF1 = 所有葡萄酒
a <- c("Malbec", "Syrah", "Cabernet Sauvignon", "Merlot")
b <- c(1, 2, 3, 4)
allwines <- data.frame(a, b)
> allwines
a b
1 Malbec 1
2 Syrah 2
3 Cabernet Sauvignon 3
4 Merlot 4
DF2 = 葡萄酒
c <- c("Charles Smith", "K Vintners", "K Vintners", "Two Vintners", "K Vintners", "Kerloo", "Betz Family", "Efeste" )
d <- c("Royal City Syrah", "Cattle King Syrah", "Klein Syrah", "Make Haste Cinsault", "The Hidden Syrah", "Stone Tree Malbec", "Le Parrain Cabernet Sauvignon", "Big Papa Cabernet Sauvignon")
wines <- data.frame(c, d)
> wines
c d
1 Charles Smith Royal City Syrah
2 K Vintners Cattle King Syrah
3 K Vintners Klein Syrah
4 Two Vintners Make Haste Cinsault
5 K Vintners The Hidden Syrah
6 Kerloo Stone Tree Malbec
7 Betz Family Le Parrain Cabernet Sauvignon
8 Efeste Big Papa Cabernet Sauvignon
期望的输出
> desired
c d ID
1 Charles Smith Royal City Syrah 2
2 K Vintners Cattle King Syrah 2
3 K Vintners Klein Syrah 2
4 Two Vintners Make Haste Cinsault NA
5 K Vintners The Hidden Syrah 2
6 Kerloo Stone Tree Malbec 1
7 Betz Family Le Parrain Cabernet Sauvignon 3
8 Efeste Big Papa Cabernet Sauvignon 3
我的尝试刚刚生成了一个充满 NA 的 ID 行。 这个想法是在 wines 行中搜索葡萄酒名称,并将它们与来自 allwines 的葡萄酒进行匹配,例如来自 allwines$a 的 Syrah 将匹配 Wines$d 中的 Royal City Syrah、Cattle King Syrah 和 Klein Syrah
【问题讨论】:
-
在您的数据中,
sum(unique(df1$Name) %in% unique(df2$Wine))给出零。因此,它不会找到任何匹配的行来加入/合并。或者,intersect(unique(df1$Name), unique(df2$Wine))给出空向量。 -
你能改变你的数据框,让
DF2$Wines 中的一些实际上与DF1$Names 匹配吗? -
也许可以试试
idx <- sapply(DF2$Wine, function(x) DF1$Name[grep(x, DF1$Name, ignore.case = TRUE)]); DF1$ID <- DF2$ID[match(names(idx[match(DF1$Name, idx)]), DF2$Wine)]。我做了一些测试用例,看起来还可以 -
@rawr 它仍在 DF1$ID 中产生 NA,但创建 idx 的第一部分似乎正在工作
-
@JamieLeigh 尝试
idx <- trimws(idx)然后使用 grepping。此外,grepping 只会寻找葡萄酒的完全匹配,因此如果葡萄酒与名称不完全匹配,您可能必须使用agrep或一些模糊匹配