【问题标题】:Data manipulation using r purrr使用 r purrr 进行数据操作
【发布时间】:2019-12-04 09:00:50
【问题描述】:

我有两个数据集 dat1 和 dat2。我想从 dat1 中提取与 dat2 中的变量对匹配的行。 var6 可以与 var1、var2、var3 和 var4 中的任何一个匹配。 var7 必须与 var5 匹配。

我想提出一个解决方案,使用 tidyverse 中 purr 包中的地图功能,但我不知道从哪里开始。感谢您的帮助!

dat1 <- data.frame(id = c(1:9), 
                   var1 = c("x","x","x","y","y","y","z","z","z"),
                   var2 = c("c","c","c","d","d","d","e","e","e"),
                   var3 = c("f","f","f","g","g","g","h","h","h"),
                   var4 = c("i","i","i","j","j","j","k","k","k"),
                   var5 = c("aa","aa","aa","aa","aa","aa","bb","bb","bb"), stringsAsFactors = FALSE)

dat2 <- data.frame(var6 = c("c", "d", "l", "m", "n"),
                   var7 = c("aa", "bb", "aa", "aa","aa"), stringsAsFactors = FALSE)

在此示例中,结果将从 dat1 中提取第 1、2 和 3 行,因为“c”在 var2 中匹配,“aa”在 var5 中匹配。

【问题讨论】:

    标签: r dictionary purrr


    【解决方案1】:

    如果我们需要逐元素比较,请使用 lapply 循环遍历 'dat1' 中的第 2 到 5 列,然后使用 outer 与 'dat2' 的 'var6' 进行逐元素比较,同时使用 ' 进行相同的比较'dat1', 'dat2' 中的 var5', 'var7' 列,检查我们是否都得到 TRUE (&amp;),然后取行和 (rowSums) 将矩阵折叠成单个逻辑向量和Reducelistvectors 进入。单个vector|,即检查每个vectors 中是否有任何行元素为TRUE。它用于对行进行子集('i1')

    i1 <- Reduce(`|`, lapply(dat1[2:5], function(x) 
         rowSums(outer(x, dat2$var6, `==`) & outer(dat1$var5, dat2$var7, `==`)) > 0 ))
    dat1[i1,]
    #  id var1 var2 var3 var4 var5
    #1  1    x    c    f    i   aa
    #2  2    x    c    f    i   aa
    #3  3    x    c    f    i   aa
    

    或使用map

    library(purrr)
    library(dplyr)
    map(dat1[2:5], ~ outer(.x, dat2$var6, `==`) &
                     outer(dat1$var5, dat2$var7, `==`)) %>%
       reduce(`+`) %>% 
       rowSums %>%
       as.logical %>%
       magrittr::extract(dat1, ., )
    #  id var1 var2 var3 var4 var5
    #1  1    x    c    f    i   aa
    #2  2    x    c    f    i   aa
    #3  3    x    c    f    i   aa
    

    【讨论】:

    • 这确实适用于这种情况,但是如果 var1 中的 var6 和 var3 中的其他匹配,那么作为更通用的解决方案,什么会起作用?
    • @JordanHackett。根据您的意见,map(dat1[2:5], ~ .x %in% dat2$var6) %&gt;% reduce(|)
    • 是的,谢谢!对不起,我不知道要问什么!您介意简要描述一下您使用的代码和功能正在做什么吗?感谢您的宝贵时间!
    • @JordanHackett。我更新了一些描述。 map/reduce 将是 lapply/Reduce 的 ssasme,除了 ~ .x 代替 function(x) x
    • 非常感谢!我很感激解释!实际上对我来说是一个比表面上更难的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2019-12-13
    • 1970-01-01
    • 2017-02-15
    • 2019-05-30
    • 2020-08-20
    • 2023-03-06
    相关资源
    最近更新 更多