根据另一个数据帧中的部分字符串选择一个数据帧的值

selecting values of one dataframe based on partial string in another dataframe

我有两个数据帧(DF1 和 DF2)

DF1 <- as.data.frame(c("A, B","C","A","C, D"))
names(DF1) <- c("parties")

DF1

 parties
    A, B
       C
       A
    C, D

.

B <- as.data.frame(c(LETTERS[1:10]))
C <- as.data.frame(1:10)
DF2 <- bind_cols(B,C)
names(DF2) <- c("party","party.number")

。 DF2

   party party.number
      A            1
      B            2
      C            3
      D            4
      E            5
      F            6
      G            7
      H            8
      I            9
      J           10

所需的结果应该是 DF1 中的一个附加列,其中包含从 DF2 中获取的 DF1 中每一行的派对编号。

期望的结果(基于 DF1):

  parties party.numbers
    A, B          1, 2
       C             3
       A             1
    C, D          3, 4

我强烈怀疑答案涉及 str_match(DF1$parties, DF2$party.number) 或类似的正则表达式,但我不知道如何将两个 (或更多) 党号到同一行 (DF2$party.numbers).

一个选项是 gsubfn 通过将模式匹配为 upper-case 字母,作为替换使用 key/value list

library(gsubfn)
DF1$party.numbers <- gsubfn("[A-Z]", setNames(as.list(DF2$party.number), 
           DF2$party), as.character(DF1$parties))
DF1
#   parties party.numbers
#1    A, B          1, 2
#2       C             3
#3       A             1
#4    C, D          3, 4

使用 tidyverse 的替代解决方案。您可以将 DF1 重塑为每行一个字符串,然后加入 DF2 然后重塑回您的初始形式:

library(tidyverse)

DF1 <- as.data.frame(c("A, B","C","A","C, D"))
names(DF1) <- c("parties")

B <- as.data.frame(c(LETTERS[1:10]))
C <- as.data.frame(1:10)
DF2 <- bind_cols(B,C)
names(DF2) <- c("party","party.number")


DF1 %>%
  group_by(id = row_number()) %>%
  separate_rows(parties) %>%
  left_join(DF2, by=c("parties"="party")) %>%
  summarise(parties = paste(parties, collapse = ", "),
            party.numbers = paste(party.number, collapse = ", ")) %>%
  select(-id)

# # A tibble: 4 x 2
#   parties party.numbers
#   <chr>   <chr>        
# 1 A, B    1, 2         
# 2 C       3            
# 3 A       1            
# 4 C, D    3, 4