列列的行方式比较

问题描述 投票:1回答:2

给定一个带有两个列表列的数据帧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))
r dplyr purrr
2个回答
2
投票

我们可以使用map2_chrpurrr

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
投票

这是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]>
© www.soinside.com 2019 - 2024. All rights reserved.