【问题标题】:Expand R dataframe based on multiple column and row criteria基于多列和多行条件展开 R 数据框
【发布时间】:2019-06-17 08:47:51
【问题描述】:

我在 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 列组成 - 用于标识每组的 AN 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

我想通过扩展上面的dataframe得到下面的dataframe。扩展的数据框将有一个名为 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

我请人帮忙。我无法解决这个问题

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    complete 中获取SFmax 值并使用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
    

    要使用 full_seq 获得预期输出,您可以在向量中添加 1

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

    【讨论】:

    • 谢谢。 seq(max(SF)) 与 full_seq 有何不同。请告诉我
    • @Thilagaraghavan 用解释更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2015-05-04
    • 2021-07-17
    • 1970-01-01
    • 2020-09-26
    • 2022-08-18
    相关资源
    最近更新 更多