расширение сгруппированных данных с использованием dplyr - PullRequest
1 голос
/ 18 июня 2019

У меня есть следующий фрейм данных в R

DF2<-data.frame("A"= c(1,2,3,4,5), "A_1"= c(1,2,3,4,5), "B"= c(1,2,10,NA,NA), "B_1"=c(2,3,10,NA, NA), "ID"=c("A", "A", "A","A","A"))

Я попытался расширить фрейм данных, используя код

 library(dplyr)
 library(tidyr)
 df2=  DF2 %>%
 mutate(E=pmax(A,B,na.rm = TRUE))%>%
 complete(E = seq(max(E)))

Столбец E должен состоять из диапазона значений в A и B. Значения A_1, B_1 должны совпадать с соответствующими значениями столбца E

Я получаю следующий вывод

       ID        E     A   A_1     B   B_1

     1 A         1     1     1     1     2
     2 A         2     2     2     2     3
     3 A         3    NA    NA    NA    NA
     4 A         4     4     4    NA    NA
     5 A         5     5     5    NA    NA
     6 A         6    NA    NA    NA    NA
     7 A         7    NA    NA    NA    NA
     8 A         8    NA    NA    NA    NA
     9 A         9    NA    NA    NA    NA
    10 A        10     3     3    10    10

Тем не менее, я ожидаю следующий вывод

     E ID  A A_1  B B_1
 1   1  A  1   1  1   2
 2   2  A  2   2  2   3
 3   3  A  3   3 NA  NA
 4   4  A  4   4 NA  NA
 5   5  A  5   5 NA  NA
 6   6  A NA  NA NA  NA
 7   7  A NA  NA NA  NA
 8   8  A NA  NA NA  NA
 9   9  A NA  NA NA  NA
 10 10  A NA  NA 10  10

Я прошу кого-нибудь помочь здесь. Окончательный результат должен соответствовать значению A_1 со значением столбца E, так что значение E должно равняться значению A, иначе он должен возвращать ноль. ID - группирующая переменная

1 Ответ

1 голос
/ 18 июня 2019

Используйте group_by ID и complete, используя max из E и replace значение до NA, если оно не соответствует столбцу E

library(dplyr)
library(tidyr)

DF2 %>%
   mutate(E=pmax(A,B,na.rm = TRUE)) %>%
   group_by(ID) %>%
   complete(E = seq(max(E))) %>%
   mutate_at(vars(matches("^A|^B")), ~replace(., . != E, NA))

#   ID        E     A   A_1     B   B_1
#   <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A         1     1     1     1     2
# 2 A         2     2     2     2     3
# 3 A         3    NA    NA    NA    NA
# 4 A         4     4     4    NA    NA
# 5 A         5     5     5    NA    NA
# 6 A         6    NA    NA    NA    NA
# 7 A         7    NA    NA    NA    NA
# 8 A         8    NA    NA    NA    NA
# 9 A         9    NA    NA    NA    NA
#10 A        10    NA    NA    10    10
...