Присвоение имен новым группам, созданным с похожими друг на друга строками - PullRequest
0 голосов
/ 01 августа 2020

этот вопрос является расширением из этого , в котором я попытался написать функцию, которая применяет 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)
     
...