рассмотрим набор данных игрушки и функцию ниже: В основном, он просматривает строки набора данных 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
раньше, мне не нужно было разрывать цепочку перед запуском функции.
Спасибо !