【问题标题】:R Reshape function when combinations doesn't exist不存在组合时的R重塑功能
【发布时间】:2020-06-24 11:35:47
【问题描述】:

我正在尝试将我的数据从 Long 重塑为 Wide,我的初始数据框如下所示:

    Crop              Partner     DM  SD_DM
   <fct>             <fct>    <dbl>  <dbl>
   1 GR                GR      2.90   0.771 
   2 IK                IK      2.79   0.279 
   3 LU                LU      3.01   0.337 
   4 LU_GR_50_50       GR      2.24   0.477 
   5 LU_GR_50_50       LU      0.706  0.458 
  6 LU_GR_75_25       GR      1.85   0.145 
  7 LU_GR_75_25       LU      1.63   0.236 
  8 OR                OR      4.57   1.27  
  9 OR_GR_50_50       GR      0.413  0.212 
 10 OR_GR_50_50       OR      3.83   1.76  
 11 OR_IK_25_75       IK      0.143  0.0410
 12 OR_IK_25_75       OR      5.55   0.694 
 13 OR_IK_GR_33_33_33 GR      0.300  0.0761
 14 OR_IK_GR_33_33_33 IK      0.0572 0.0496
 15 OR_IK_GR_33_33_33 OR      4.00   0.484 

我正在使用以下代码,但它不起作用:

    DMN_Graph <- DMN_Graph %>%
    reshape(idvar= "Partner",timevar = "Crop" ,direction="wide")

我需要最终结果是这样的(这是应该如何的一个小表示)

       Partner    GR_DM  GR_SD_DM    LU_DM  LU_SD_DM LU_GR_50_50_DM LU_GR_50_50_SD_DM 
     1      GR 2.903483 0.7713203       NA        NA      2.2413259         0.4767502       
     2      LU       NA        NA 3.012506 0.3369118      0.7057679         0.4584558       
     3      OR       NA        NA       NA        NA             NA                NA             
     4      IK       NA        NA       NA        NA             NA                NA   

但它返回给我的是

    # A tibble: 4 x 3
     Partner `DM.1:9` `SD_DM.1:9`
    <fct>   <fct>    <fct>      
    1 GR      NA       NA         
    2 IK      NA       NA         
    3 LU      NA       NA         
    4 OR      NA       NA     

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    这个答案使用了tidyr 包,它'替换了reshape2 (2010-2014) 和reshape (2005-2010)'(更多信息可以在here 中找到)。

    这是你应该做的:

    library(tidyr) # 1.1.0
    
    DMN_Graph_wide <– DMN_Graph %>%
      pivot_wider(names_from = Crop, values_from = c(DM, SD_DM))
    
    # A tibble: 4 x 19
      Partner DM_GR DM_IK DM_LU DM_LU_GR_50_50 DM_LU_GR_75_25 DM_OR DM_OR_GR_50_50
      <chr>   <dbl> <dbl> <dbl>          <dbl>          <dbl> <dbl>          <dbl>
    1 GR        2.9 NA    NA             2.24            1.85 NA             0.413
    2 IK       NA    2.79 NA            NA              NA    NA            NA    
    3 LU       NA   NA     3.01          0.706           1.63 NA            NA    
    4 OR       NA   NA    NA            NA              NA     4.57          3.83 
    # … with 11 more variables...
    

    行和列的顺序略有不同,但如果我们添加一些“重新排列”功能,我们可以获得您想要的输出:

    DMN_Graph_wide %>%
      dplyr::select(Partner, DM_GR, SD_DM_GR, DM_LU, SD_DM_LU, DM_LU_GR_50_50, SD_DM_LU_GR_50_50) %>%
      dplyr::arrange(factor(Partner, levels = c("GR", "LU", "OR", "IK")))
    
    # A tibble: 4 x 7
      Partner DM_GR SD_DM_GR DM_LU SD_DM_LU DM_LU_GR_50_50 SD_DM_LU_GR_50_50
      <chr>   <dbl>    <dbl> <dbl>    <dbl>          <dbl>             <dbl>
    1 GR        2.9    0.771 NA      NA              2.24              0.477
    2 LU       NA     NA      3.01    0.337          0.706             0.458
    3 OR       NA     NA     NA      NA             NA                NA    
    4 IK       NA     NA     NA      NA             NA                NA  
    

    您可以使用select()arrange() - 它们来自dplyr 包。请注意,上面的代码本质上并没有改变您的宽数据格式;它只是排列方式略有不同 - DMN_Graph_wide 就是您所需要的。

    我的代码唯一没有做的就是给出你想要的列名(DM_GR 而不是GR_DM)。您可以阅读此here 的可能解决方案。


    对于未来,在 SO 上使用dput(DMN_Graph) 提供数据是有帮助的:

    > dput(DMN_Graph)
    structure(list(Crop = c("GR", "IK", "LU", "LU_GR_50_50", "LU_GR_50_50", 
    "LU_GR_75_25", "LU_GR_75_25", "OR", "OR_GR_50_50", "OR_GR_50_50", 
    "OR_IK_25_75", "OR_IK_25_75", "OR_IK_GR_33_33_33", "OR_IK_GR_33_33_33", 
    "OR_IK_GR_33_33_33"), Partner = c("GR", "IK", "LU", "GR", "LU", 
    "GR", "LU", "OR", "GR", "OR", "IK", "OR", "GR", "IK", "OR"), 
        DM = c("2.9000", "2.7900", "3.0100", "2.2400", "0.7060", 
        "1.8500", "1.6300", "4.5700", "0.4130", "3.8300", "0.1430", 
        "5.5500", "0.3000", "0.0572", "4.0000"), SD_DM = c("0.7710", 
        "0.2790", "0.3370", "0.4770", "0.4580", "0.1450", "0.2360", 
        "1.2700", "0.2120", "1.7600", "0.0410", "0.6940", "0.0761", 
        "0.0496", "0.4840")), row.names = c(NA, -15L), class = c("tbl_df", 
    "tbl", "data.frame"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2021-04-21
      • 2017-04-28
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多