给出一个具有两个由字符向量组成的列表列的数据框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))
答案 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]>