【问题标题】:Compare string to column in different dataframe r将字符串与不同数据框 r 中的列进行比较
【发布时间】:2019-08-28 15:53:39
【问题描述】:

我有一个数据框df_EU,由在欧盟工作的科学家组成,格式如下:

Author ID     Country Year
A      12345  UK      2011
B      13254  Germany 2018
C      54952  Belgium 2005
D      58774  UK      2009
E      88569  Italy   2015
...

然后,我有另一个数据框,其中包含来自美国的科学家df_US,格式相同。现在,我要做的是为美国数据帧添加一个新列,在其中我将美国数据帧中的每个 ID 与欧盟数据帧中的所有 ID 进行比较。每次匹配时,我希望在新列中出现一个 1,对于每个不在 EU 集中的 ID,一个 0。

到目前为止,我相当确定我的解决方案应该包含mapply,并且我从this question 中扣除了我可以使用以下方法“加载”ID 号的值:

mapply(function(i, j) length(grep(i, j)), df_EU$ID, df_US$ID)

然而,我对如何从这里开始感到很迷茫。我从未真正使用过函数,因此非常感谢您的帮助!非常感谢。

另一个问题是,科学家可能会在每个数据帧中出现多次,因为他们不是按其唯一名称列出,而是按在相应地区出现的出版物列出。

【问题讨论】:

  • 这些是相同尺寸和相同数量的“ID”,那么只有mapply 有效。
  • 不幸的是,不同的数据帧有不同的行数。列数和列名相同
  • 你为什么不直接绑定它们呢? dplyr::left_join(df_EU, df_US, by="ID") 或者 dplyr::intersect()
  • 您是否只是在寻找是否有任何常见的、准确的 ID?如果是这样,只需使用%in%df_US$in_EU <- as.integer(df_US$ID %in% df_EU$ID)。请记住,如果您有的话,这也将匹配 NA
  • @Andrew 这正是我一直在寻找的! :)

标签: r


【解决方案1】:

在这里,我们可以使用regex_fuzzy_join

library(fuzzyjoin)
df_US <- regex_left_join(df_US, df_EU %>%
                            select(ID), by = 'ID') %>%
             mutate(EU_migration = !is.na(ID.y))

【讨论】:

  • 我需要以某种方式分配它还是为我生成一个全新的数据框?因为我试图用 df_US$EU_migration Error in $(*tmp*, eu_mig, value = list(X1 = c(0, 1, 2, : replacement has 9298 rows, data has 9202
  • @P.Weyh 如果您希望将列命名为 'EU_migration, then df_US % select(ID), by = 'ID') %>%变异(EU_migration= !is.na(ID.y))`
  • 好的,我试过了,但由于某种原因,代码多次计算了一些命中(1-8 次)。如果有帮助,我可以给你数据,但它太大了,不能用dput 在这里发布。感谢您的指导!
  • @P.Weyh 我使用regex_left_join 只是因为你的grep。如果是完全匹配,那么%in%更合适
  • @P.Weyh 没关系。使用dplyr,它将是df_US &lt;- df_US %&gt;% mutate(EU_migration = as.integer(ID %in% df_EU$ID))
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 2020-09-11
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多