R:重新排列按一列排序的数据

时间:2018-06-18 07:59:00

标签: r dataframe data-mining reshape

假设我有以下简短示例。我的目标是按列data.frame重新排列"n",以便输出如下所示。由于我还是初学者,我不知道该怎么做。我尝试了reshape2

         Method   n    lambda     df       
10.fold.CV Lasso 30  1.3102653 21.199    
10.fold.CV.1SE   30  3.3734592 17.379 
10.fold.CV Lasso 50  0.8956816 28.713 
10.fold.CV.1SE   50  2.3527001 25.540 
BIC              50  1.9833844 24.757 
Modified.BIC     50  0.2091384 31.714 
10.fold.CV Lasso 100 0.6467475 33.591  
10.fold.CV.1SE   100 2.4961030 32.092

预期输出应如下所示:

                  Lambda30  df30      Lambda50  df50   Lambda100 df100     
10.fold.CV Lasso  1.3102653 21.199   0.8956816 28.713  0.6467475 33.591 
10.fold.CV.1SE    2.3527001 25.540   3.3734592 17.379  2.4961030 32.092
BIC                                  1.9833844 24.757   ..
Modified.BIC                         0.2091384 31.714   ..

1 个答案:

答案 0 :(得分:3)

您可以执行以下操作

library(tidyverse);
df %>%
    gather(k, v, -Method, -n) %>%
    unite(tmp, k, n, sep = "_") %>%
    spread(tmp, v)
#            Method df_100  df_30  df_50 lambda_100 lambda_30 lambda_50
#1 10.fold.CV Lasso 33.591 21.199 28.713  0.6467475  1.310265 0.8956816
#2   10.fold.CV.1SE 32.092 17.379 25.540  2.4961030  3.373459 2.3527001
#3              BIC     NA     NA 24.757         NA        NA 1.9833844
#4     Modified.BIC     NA     NA 31.714         NA        NA 0.2091384

说明:在tidyverse中,使用tidyr::gathertidyr::unite列从宽到长重新整形,并使用{{1从长到长重新整形,这是一个相当简单的问题}}

如有必要,请重新排序列,例如tidyr::spread

样本数据

select