【问题标题】:loop through and match one dataframe to another with a lookup column taking a unique row each time (in terms of value in another column)循环遍历一个数据帧并将一个数据帧与另一个数据帧匹配,查找列每次取一个唯一行(就另一列中的值而言)
【发布时间】:2021-12-11 16:23:04
【问题描述】:

我不知道我是否错误地搜索了这个问题,因为这很难解释,但到目前为止我还没有在网上找到任何答案!基本上我有两个数据框,DF1 有 120 行,DF2 有 22000 行。它们都有一个“查找”列,基于其他三个列的值。它们看起来像这样(一个子集):

DF1:

Lookup
EM1PRI
EM1PRI
EM2PRI
EM3PRI
EM3PRI

DF2:

Lookup ID
EM1PRI 14567
EM1PRI 12345
EM1PRI 13456
EM1PRI 15678
EM2PRI 16789
WM1PRI 17890

我想从 DF2 中获取每个可用匹配的 ID 到 DF1 中的查找列,循环遍历而不替换,因此每个 ID 都是唯一的。如果没有可用的,那么它需要是 NA。这就是我希望输出的样子:

DF3:

Lookup ID
EM1PRI 14567
EM1PRI 12345
EM2PRI 16789
EM3PRI NA
EM3PRI NA

我不知道这是循环还是匹配或合并,还是三者兼而有之。非常感谢您的任何建议!

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: r loops join merge match


【解决方案1】:

一种方法是对两个 data.frame 中的每个 Lookup 值使用行号,然后连接 Lookup 值和行号。

library(dplyr)

df1 %>%
  group_by(Lookup) %>%
  mutate(rn = row_number()) %>%
  left_join(df2 %>% 
              group_by(Lookup) %>%
              mutate(rn = row_number())) %>%
  dplyr::select(-rn)

输出

  Lookup    ID
  <chr>  <dbl>
1 EM1PRI 14567
2 EM1PRI 12345
3 EM2PRI 16789
4 EM3PRI    NA
5 EM3PRI    NA

数据

df1 <- structure(list(Lookup = c("EM1PRI", "EM1PRI", "EM2PRI", "EM3PRI", 
"EM3PRI")), class = "data.frame", row.names = c(NA, -5L))

df2 <- structure(list(Lookup = c("EM1PRI", "EM1PRI", "EM1PRI", "EM1PRI", 
"EM2PRI", "WM1PRI"), ID = c(14567, 12345, 13456, 15678, 16789, 
17890)), class = "data.frame", row.names = c(NA, -6L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2018-03-30
    • 2018-01-10
    • 2021-10-14
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多