使用dplyr分组数据帧扩展

时间:2019-06-18 04:59:31

标签: r dataframe dplyr tidyr

我在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 个答案:

答案 0 :(得分:1)

使用group_by中的IDcomplete中的max使用E replaceNA,{ t匹配列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