簡體   English   中英

列列的行方式比較

[英]Row-wise comparisons of list columns

給定一個帶有兩個列表列的數據幀dat ,由字符向量組成,我想使用mutate()創建一個新列,其中包含在secondary_report_ids中不存在的copub元素。

到目前為止,我找不到使用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))

我們可以使用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)

這是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]>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM