列表列的行比较

时间:2019-04-12 00:06:20

标签: r dplyr purrr

给出一个具有两个由字符向量组成的列表列的数据框dat,我想使用mutate()创建一个包含以下内容的新列 copub中没有的secondary_report_ids元素。

到目前为止,我找不到使用purrr::map()以行方式应用setdiff()的解决方案。

dat <- structure(list(unique_study_id = c("13", "21", "3", "2", "78"
    ), srdr_id = c("174212", "172787", "174230", "174200", "174408"
    ), secondary_report_ids = list("174299", NA_character_, c("174081", 
    "174817", "174804", "172844", "172845"), c("175114", "174839", 
    "174240"), c("174094", "172575")), copub = list(c("174299", "174202", 
    "174283"), c("172567", "172566", "172621"), c("174817", "174804", 
    "172844", "172845", "174081", "174080", "174079"), c("172501", 
    "172961", "174564", "175114", "172498", "174839", "174240"), 
        c("172575", "174094"))), class = c("spec_tbl_df", "tbl_df", 
    "tbl", "data.frame"), row.names = c(NA, -5L))

2 个答案:

答案 0 :(得分:2)

我们可以使用map2_chr中的purrr

library(dplyr)
library(purrr)

dat %>%
  mutate(new_col = map2_chr(copub, secondary_report_ids, ~toString(setdiff(.x, .y))))

# unique_study_id srdr_id secondary_report_ids copub     new_col                       
#  <chr>           <chr>   <list>           <list>    <chr>                         
#1 13              174212  <chr [1]>        <chr [3]> 174202, 174283                
#2 21              172787  <chr [1]>        <chr [3]> 172567, 172566, 172621        
#3 3               174230  <chr [5]>        <chr [7]> 174080, 174079                
#4 2               174200  <chr [3]>        <chr [7]> 172501, 172961, 174564, 172498
#5 78              174408  <chr [2]>        <chr [2]> ""                     

上面为每行提供了一个逗号分隔的字符串。

如果您希望最终输出为另一个列表,我们可以使用map2

dat %>%
  mutate(new_col = map2(copub, secondary_report_ids, setdiff))

# unique_study_id srdr_id secondary_report_ids copub     new_col  
# <chr>           <chr>   <list>               <list>    <list>   
#1 13              174212  <chr [1]>            <chr [3]> <chr [2]>
#2 21              172787  <chr [1]>            <chr [3]> <chr [3]>
#3 3               174230  <chr [5]>            <chr [7]> <chr [2]>
#4 2               174200  <chr [3]>            <chr [7]> <chr [4]>
#5 78              174408  <chr [2]>            <chr [2]> <chr [0]>

在基数R中,我们可以使用mapply

mapply(function(x, y) toString(setdiff(x, y)), dat$copub, dat$secondary_report_ids)

mapply(setdiff, dat$copub, dat$secondary_report_ids)

答案 1 :(得分:1)

这里是pmap

的一个选项
library(tidyverse)
dat %>% 
   mutate(new_col = pmap(list(copub, secondary_report_ids), setdiff))
# A tibble: 5 x 5
#  unique_study_id srdr_id secondary_report_ids copub     new_col  
#  <chr>           <chr>   <list>               <list>    <list>   
#1 13              174212  <chr [1]>            <chr [3]> <chr [2]>
#2 21              172787  <chr [1]>            <chr [3]> <chr [3]>
#3 3               174230  <chr [5]>            <chr [7]> <chr [2]>
#4 2               174200  <chr [3]>            <chr [7]> <chr [4]>
#5 78              174408  <chr [2]>            <chr [2]> <chr [0]>