【问题标题】:How do I match a character vector to a list of character vectors in a tibble in R?如何将字符向量与 R 中 tibble 中的字符向量列表匹配?
【发布时间】:2019-04-10 03:02:54
【问题描述】:

我想将 tibble 中的 A 列与 B 列进行比较,以查看 A 列中的元素是否存在于 B 列中。A 列是字符向量。 B 列是字符向量列表。我想一行一行地做这件事。我可以用循环来做到这一点。

library(tidyverse)

my.tibble = c('a','b','c') %>% tibble
my.list = list(c('a','b'),c('b','c'),c('d','e'))
my.tibble = my.tibble %>% add_column(my.list)

its.in.it = as.list(NULL)
for (i in 1:nrow(my.tibble)){
    its.in.it[[i]] = my.tibble[i,1] %in% unlist(my.tibble[i,2])
}

my.tibble$its.in.it = unlist(its.in.it)
my.tibble

我正在尝试使用 dplyr/purrr 或应用来执行此操作。我不确定是应该分组还是嵌套或拆分,并且有很多组合。

【问题讨论】:

    标签: r dplyr tidyverse purrr


    【解决方案1】:

    我们可以使用rowwise

    library(tidyverse)
    names(my.tibble) <- LETTERS[1:2]
    my.tibble %>% 
       rowwise() %>%
       mutate(itsinit = A  %in% unlist(B))
    # A tibble: 3 x 3
    #  A     B         itsinit
    #  <chr> <list>    <lgl>  
    #1 a     <chr [2]> TRUE   
    #2 b     <chr [2]> TRUE   
    #3 c     <chr [2]> FALSE  
    

    注意:@kath 使用 map2 的方法会更快

    【讨论】:

      【解决方案2】:

      您可以使用map2_lgl,它接受两个输入,遍历它们并返回一个逻辑向量。

      names(my.tibble) <- c("char", "char.list")
      my.tibble %>% 
        mutate(its.in.it = map2_lgl(char, char.list, ~ .x %in% .y))
      
      # A tibble: 3 x 3
      #   char  char.list its.in.it
      #   <chr> <list>    <lgl>    
      # 1 a     <chr [2]> TRUE     
      # 2 b     <chr [2]> TRUE     
      # 3 c     <chr [2]> FALSE  
      

      【讨论】:

        【解决方案3】:

        apply 会是这样的:

        apply(my.tibble, 1, function(x) x[1] %in% unlist(x[2]))
        #[1]  TRUE  TRUE FALSE
        
        my.tibble$its.in.it <- apply(my.tibble, 1, function(x) x[1] %in% unlist(x[2]))
        

        【讨论】:

          【解决方案4】:

          还有一个 dplyr 版本的 apply 解决方案。

          my.tibble %&gt;% mutate(its.in.it = . %in% unlist(my.tibble$my.list))

          【讨论】:

          • 这会引发错误。请在发布之前测试您的代码。
          • 你能指定错误吗?我没有错误。 R version 3.5.1 (2018-07-02)Platform: x86_64-apple-darwin15.6.0 (64-bit)Running under: macOS High Sierra 10.13.2[1] bindrcpp_0.2.2 forcats_0.3.0 stringr_1.3.1 dplyr_0.7.7 purrr_0.2.5 readr_1.1.1 [7] tidyr_0.8.2 tibble_1.4.2 ggplot2_3.1.0 tidyverse_1.2.1
          • 我很抱歉,我的错误。它不再如此,所以我可能在我的 R 会话中弄乱了你的代码。但现在我得到了所有TRUE,它应该是前两个TRUE,第三个是FALSE。你能检查一下吗,豌豆?
          • my.tibble %&gt;% mutate(its.in.it = . %in% unlist(my.list)) 有效,但 my.tibble %&gt;% mutate(its.in.it = . %in% unlist(my.tibble$my.list)) 无效(它也会为我返回 c(T,T,T) 结果,但它不应该)而且我不知道为什么。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-03
          • 1970-01-01
          • 1970-01-01
          • 2016-03-23
          • 1970-01-01
          • 2020-10-14
          • 1970-01-01
          相关资源
          最近更新 更多