【问题标题】:How to create an index in a data frame based on another data frame in R如何基于R中的另一个数据框在数据框中创建索引
【发布时间】: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 &lt;- sapply(DF2$Wine, function(x) DF1$Name[grep(x, DF1$Name, ignore.case = TRUE)]); DF1$ID &lt;- DF2$ID[match(names(idx[match(DF1$Name, idx)]), DF2$Wine)]。我做了一些测试用例,看起来还可以
  • @rawr 它仍在 DF1$ID 中产生 NA,但创建 idx 的第一部分似乎正在工作
  • @JamieLeigh 尝试 idx &lt;- trimws(idx) 然后使用 grepping。此外,grepping 只会寻找葡萄酒的完全匹配,因此如果葡萄酒与名称不完全匹配,您可能必须使用 agrep 或一些模糊匹配

标签: r indexing dataframe


【解决方案1】:

如果名称在 df2$Wine 和 df1$Name 之间完全匹配,您只需加入这些列即可获得所需的内容。

在创建所有 NA 的列表之前,请尝试以下操作:

library(dplyr)
newdf <- left_join(df1, df2, by = c('Name', 'Wine'))

newdf 现在应该包含 df1 中的所有原始行,以及相应的 ID(如果在 df2 中找到)。

当然,这是假设所有内容的格式正确且名称匹配。

【讨论】:

  • 我不是在寻找完全匹配的东西,我想做的是如果 Wines$Name contains allwines$Wine 它会把 ID 号放进去。因为名字在 Wines$Name 中是唯一的,例如 Royal City Syrah,我希望它与来自 allwines$Wine 的 Syrah 匹配。
  • 好的,您能否编辑您的问题以反映这一点?此外,也许提供一个预期输出的示例会有所帮助(在当前情况下,没有相似之处)。
猜你喜欢
  • 2016-05-07
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2018-05-20
  • 2020-04-21
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多