【发布时间】:2020-08-05 05:15:18
【问题描述】:
考虑下面的玩具数据集和函数:
基本上,它遍历数据集df 的行并根据某些标准查找匹配项。如果有匹配项,则观察结果与其中一个匹配项的行号匹配。
dataset <- data.frame(id_dom = c(20, 20, 20, 250, 250, 250,
254, 254, 254),
p201 = c(1, NA, 2, NA, NA, NA, 2, 1, 2),
V2009 = c(63, 42, 64, 26, 5, 4, 69, 30, 68)
)
match1 <- function(i, df) {
j <- 1:nrow(df)
if(!is.na(df$p201[i])){
l <- df$p201[i]
} else{
k <- abs(df$V2009[i] - df$V2009[j]) <= 1
l <- ifelse(any(k), which(k), i)
}
return(l)
}
这就是我将如何应用该功能:
dataset2 <- dataset %>%
group_by(id_dom,
index = map_dbl(seq(nrow(.)),
~ .x %>% match1(df = dataset))) %>%
mutate(p201 = (first(na.omit(V2009)) - 1)*100)
如您所见,我的最终目标是将index 和id_dom 的观察结果配对 - 因此,如果i 运行它会更快(而且我认为它也会产生更好的结果)仅通过每个 id_dom 组的行,而不是整个数据集。
我希望得到这样的答案:
i) 不会将id_dom 的分组放在match1 函数中,而是放在管道中。
ii) 这让我可以写出类似map_dbl(seq(nrow(.)), ~ .x %>% match1(df = . )) 的东西——这样如果我之前创建了V2009 变量,我就不需要在运行函数之前断开链。
谢谢!
【问题讨论】:
-
我认为您的
match1函数可以重写并提高效率。你能解释一下你试图在那里实施的条件吗? -
@RonakShak 我在示例中对其进行了一些简化。但一般来说,它将具有
p201 = NA的每一行i与组id_dom中的其他观察值j 进行比较。如果任意 j 个元素满足比较条件,则函数返回满足条件的最小行索引。如果不是,则返回i -
好吧..所以我猜你对改变
match1函数不感兴趣,因为这只是实际函数的简化版本。 -
简化只针对匹配的条件,其他列有多个条件。但是它们都使用相同的跨行操作结构。如果仍然可能的话,我会非常愿意更改功能