【问题标题】:selecting values of one dataframe based on partial string in another dataframe根据另一个数据帧中的部分字符串选择一个数据帧的值
【发布时间】:2018-03-21 16:34:46
【问题描述】:

我有两个数据框(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)。

【问题讨论】:

    标签: r pattern-matching stringr


    【解决方案1】:

    一个选项是gsubfn,通过将模式匹配为大写字母,作为替换使用键/值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
    

    【讨论】:

      【解决方案2】:

      使用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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 2019-08-20
        • 2021-08-11
        • 1970-01-01
        • 2022-01-24
        • 2020-08-31
        相关资源
        最近更新 更多