gpt4 book ai didi

r - 使用 r purrr 进行数据操作

转载 作者:行者123 更新时间:2023-12-04 11:23:23 27 4
gpt4 key购买 nike

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

我想使用 tidyverse 中 purr 包中的 map 函数提出一个解决方案,但我不确定从哪里开始。感谢您的任何帮助!

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 中匹配。

最佳答案

如果我们需要按元素进行比较,请使用 lapply 循环遍历 'dat1' 中的第 2 到 5 列。 ,然后使用 outer 与 'dat2' 的 'var6' 进行元素比较在对分别来自 'dat1' 和 'dat2' 的 'var5'、'var7' 列进行相同的比较时,检查我们是否将两者都设为 TRUE(&),然后取行明智的总和(rowSums)折叠将矩阵转换为单个逻辑向量和 Reduce list .的 vector s 进入。单vector|即检查每个 vector 中的任何行元素是否为 TRUE s。它用于子集行('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

关于r - 使用 r purrr 进行数据操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57212871/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com