этот вопрос является расширением из этого , в котором я попытался написать функцию, которая применяет split-apply-bind
logi c для сопоставления наблюдений в зависимости от того, насколько близки были некоторые значения из некоторых столбцы. В итоге, вот упрощенный набор данных, и я покажу упрощенное преобразование ниже:
df <- data.frame(id = c(1, 1, 1, 1),
p201 = c(1, 1, 1, NA),
n_p = c(1, 2, 3, 4),
V1 = c(1, 1.5, 2.1, 2.6),
V2 = c(1, 1, 1, 1)
)
Дело в том, что, предположим, я сгруппировал данные по столбцу id
, я хочу изменить p201
по заданному критерию. В этом случае, помимо того же самого id
, наблюдения должны иметь свои исходные p201
значения на расстоянии 0.5
друг от друга (или иметь общее наблюдение внутри радиуса 0.5
- например: 3 строки с p201 = 1
, p201 = 1.5
и p201 = 2
должны совпадать вместе).
Если эти наблюдения совпадают, тогда p201
равно p201 = (first(na.omit(n_p) - 1)*100 + V2
- я не знаю, как express это, но first(.)
в данном случае означает первое значение в новой группе, образованной совпадающими строками , , а не исходной id
группой.
Например, мой последний набор данных будет:
id p201 n_p V1 V2
1 1 1 1 1.0 1
2 1 1 2 1.5 1
3 1 201 3 2.1 1
4 1 201 4 2.6 1
Как я мог сделать такое? Я подумал о создании какого-то индекса для этих новых подгрупп, а затем снова сгруппировать его вместе с id
.
Любая помощь, пожалуйста?
EDIT : I нашел решение основной проблемы, по крайней мере, частично - я нашел способ создавать подгруппы на основе определенного условия. Дело в том, что я не знаю, как связать эти соединения: т.е. в моем коде наблюдение с V1 = 1
будет связываться с другим с V1 = 1.5
, но не с V1 = 2
и V1 = 2.1
- в идеальных условиях , все они будут связаны вместе, поскольку первое подключается ко второму, которое подключается к третьему, которое, в свою очередь, подключается к четвертому значению.
В любом случае, это то, что я делал до сих пор:
Думаю, я нашел ответ. Любые комментарии приветствуются!
Вот оно:
rowwise_logic <- function(i) {
j <- 1:nrow(df)
k <- abs(df$V1[i] - df$V1[j]) <= 0.5
ifelse(any(abs(df$V1[i] - df$V1[j]) <= 0.5), which(k), i)
}
df %>%
group_by(id, indice = map_dbl(seq(nrow(df)), rowwise_logic)) %>%
mutate(p201 = (first(na.omit(n_p)) - 1)*100 + V2)