根据多个列和行条件扩展R数据框

时间:2019-06-17 08:47:51

标签: r dplyr tidyr

我在R Studio中具有以下数据框

 DF1<-data.frame('X_F'=c(1,2,3,4,5, NA, NA, NA, 1,2,3,4,5), "X_A"=c(.1,.2,.3,.4,.5, NA, NA, NA, .2,.3,.4, .5,.6),"Y_F"=c(2,3,5,NA, 7, 1,3, 4, 1,NA,3,4,5), "Y_A"=c(.2,.3,.4,NA, .7, .1,.2,.7,.1,NA, .3,.4,.5),'ID'=c("A", "A", "A", "A", "A", "B", "B", "B", "C", "C", "C","C",'C'))

数据帧由5列组成-用于标识每组的ID ID列和两组参数X_F,Y_F和对应的A值集X_A,Y_A。

数据框如下所示。

   X_F  X_A  Y_F  Y_A ID
   1    0.1   2   0.2  A
   2    0.2   3   0.3  A
   3    0.3   5   0.4  A
   4    0.4   NA  NA   A
   5    0.5   7   0.7  A
   NA   NA    1   0.1  B
   NA   NA    3   0.2  B
   NA   NA    4   0.7  B
   1   0.2    1   0.1  C
   2   0.3    NA  NA   C
   3   0.4    3   0.3  C
   4   0.5    4   0.4  C
   5   0.6    5   0.5  C

我想通过扩展上述数据框来获得以下数据框。扩展的数据框将有一个称为SF的额外列。 SF的价值 由ID分组的X_F,Y_F列范围得出。此范围的每一步均以值1分隔

     ID  SF   X_F  X_A   Y_F  Y_A
 1   A    1    1    0.1   1   NA
 2   A    2    2    0.2   2   0.2
 3   A    3    3    0.3   3   0.3
 4   A    4    4    0.4   4   NA
 5   A    5    5    0.5   5   0.4
 6   A    6    6    NA    6   NA
 7   A    7    7    NA    7   0.7
 8   B    1    1    NA    1   0.1
 9   B    2    2    NA    2   NA
 10  B    3    3    NA    3   0.2
 11  B    4    4    NA    4   0.7
 12  C    1    1    0.2   1   0.1
 13  C    2    2    0.3   2   NA
 14  C    3    3    0.4   3   0.3
 15  C    4    4    0.5   4   0.4
 16  C    5    5    0.6   5   0.5

我尝试了这种方法以获得所需的结果。

  library(dplyr)
  library(tidyr)
  DF1

    DF2<-DF1%>%group_by(ID)%>% mutate(SF=pmax(X_F, Y_F, na.rm = T))%>%
    complete(SF=(full_seq(SF ,1)))

与上面的预期输出相反,我得到了以下输出

   ID       SF   X_F   X_A   Y_F   Y_A
  <fct>   <dbl> <dbl> <dbl> <dbl> <dbl>
   A       2     1     0.1   2     0.2
   A       3     2     0.2   3     0.3
   A       4     4     0.4   NA     NA  
   A       5     3     0.3    5    0.4
   A       6    NA     NA    NA    NA  
   A       7     5     0.5   7     0.7
   B       1    NA     NA    1     0.1
   B       2    NA     NA    NA    NA  
   B       3    NA     NA    3     0.2
   B       4    NA     NA    4     0.7
   C       1     1     0.2   1     0.1
   C       2     2     0.3   NA    NA  
   C       3     3     0.4   3     0.3
   C       4     4     0.5   4     0.4
   C       5     5     0.6   5     0.5

我请求某人帮助。无法解决这个问题

1 个答案:

答案 0 :(得分:0)

max中获取SF的{​​{1}}值,并使用complete代替seq,因为

full_seq

所以尝试做

full_seq(2:4, 1) #gives
#[1] 2 3 4
#whereas
seq(max(2:4)) #gives
#[1] 1 2 3 4

要获得library(dplyr) library(tidyr) DF1 %>% group_by(ID) %>% mutate(SF= pmax(X_F, Y_F, na.rm = T)) %>% complete(SF = seq(max(SF))) # ID SF X_F X_A Y_F Y_A # <fct> <dbl> <dbl> <dbl> <dbl> <dbl> # 1 A 1 NA NA NA NA # 2 A 2 1 0.1 2 0.2 # 3 A 3 2 0.2 3 0.3 # 4 A 4 4 0.4 NA NA # 5 A 5 3 0.3 5 0.4 # 6 A 6 NA NA NA NA # 7 A 7 5 0.5 7 0.7 # 8 B 1 NA NA 1 0.1 # 9 B 2 NA NA NA NA #10 B 3 NA NA 3 0.2 #11 B 4 NA NA 4 0.7 #12 C 1 1 0.2 1 0.1 #13 C 2 2 0.3 NA NA #14 C 3 3 0.4 3 0.3 #15 C 4 4 0.5 4 0.4 #16 C 5 5 0.6 5 0.5 的预期输出,可以在向量中加1

full_seq