R:如何用前两列作为自变量重塑数据框?

R: how to reshape data frame with the first two columns as independent variable?

我正在尝试建立一个数据框,其中月份和地点作为自变量,长度作为唯一的因变量。但我不确定哪个功能可以提供帮助。目前,我有一个很长的数据框,我想把它变宽。

我试过用dcast(package: reshape2),但是它把因变量总结成了length。因此,它不是将每个数据点作为输出,而是告诉我每个月份和站点的组合有多少个数据点。

structure(list(month = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5), site = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L), .Label = c("port", "bluff", "palme"), class = "factor"), 
    length = c(14.5, 8, 9.6, 11.3, 16.8, 13.4, 13.3, 16.1, 12.1, 
    9.5, 13.6, 9.5, 20.1, 19, 21.8, 14, 13.6, 16.4, 22, 15.6, 
    15.7, 25.4, 32, 30, 11.5, 18.3, 10.2, 7.4, 9, 12.5, 36.45, 
    51.5, 56, 35.1, 35.5, 31.1, 39.9, 55.4, 39.4, 72, 48, 15.7, 
    39.95, 21.3, 25.9, 42.2, 25.2, 60, 26.1, 44.2, 31.5, 41.3, 
    34.6, 46.7, 33, 52.2, 20.8, 16.9, 16, 55.3, 108.3, 84.4, 
    100, 32.95, 43, 132, 144.4, 101.2, 106.4, 87.7, 113.7, 25, 
    123, 126.8, 61.25, 94, 126, 98.8, 102.6, 107.6, 137, 98.7, 
    29.1, 136.9, 83.5, 32.1, 63.7, 95.5, 95.8, 117.4, 47.4, 54.2, 
    78.4, 98.5, 47.1, 55.3, 122.4, 34.5, 60.2, 64.5, 44.9, 71, 
    66.3, 33.6, 33.7, 61.7, 38.5, 44.9, 36.8, 15.4, 15.6, 21.3, 
    16.4, 63.6, 40, 111.1, 39.1, 65.7, 45.9, 20, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 14, 18.7, 13.5, 15.2, 16.5, 19.3, 6.5, 
    19.8, 17, 19.1, 14.5, 14.1, 10.1, 15.4, 14.3, 13.4, 4.8, 
    15.4, 17.5, 11.6, 8.4, 10.1, 11.4, 6.9, 13, 29, 30.7, 17.2, 
    10.7, 15.5, 45.5, 34.5, 23.5, 41, 32.1, 21.9, 52.1, 25.1, 
    19, 57.8, 46.5, 26.8, 64.5, 65, 68, 69.4, 13.2, 71.6, 67, 
    45.6, 22.7, 61.5, 27.8, 35, 40.9, 49.3, 27.9, 15.2, 27.4, 
    11.5, 55.8, 123, 144.2, 88.2, 48.3, 56.1, 159, 111.4, 170.5, 
    69, 77.6, 67.9, 69.8, 18.1, 96.8, 116.7, 124.5, 25.2, 120, 
    122.4, 95, 16, 117.1, 26.3, 124.3, 100.8, 36.9, 47, 16.6, 
    94.2, 54.3, 40.6, 138.7, 56, 87.2, 82.5, 53, 77.5, 63.5, 
    73.8, 43.1, 35.3, 139, 77.6, 77.9, 91, 48.2, 121.3, 43.4, 
    163, 144.9, 67.6, 62.9, 52.9, 85.1, 67.5, 56.6, 47.1, 153.7, 
    43.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 28.8, 72.3, 21, 58.7, 52.5, 34.7, 61, 29.1, 
    47.9, 60.1, 73.4, 38.8, 64.2, 60.4, 35.6, 53.6, 66.4, 75.1, 
    29.3, 39.5, 38.6, 41.7, 61.4, 79.5, 69.8, 77.7, 74.2, 26.6, 
    27, 62.9, 54.9, 56.5, 50, 36.2, 49.8, 46.4, 36, 38.3, 28.4, 
    96.2, 118.3, 133.4, 98.5, 140.4, 145, 144.9, 123.85, 59.2, 
    137.9, 137.1, 51.9, 115.1, 48.6, 123.5, 136.8, 148, 135.8, 
    15, 143.9, 83.4, 38.2, 25.4, 26.3, 82, 106.2, 83.3, 99.8, 
    102.9, 107.5, 71.6, 69.3, 68.5, 128.8, 143.3, 125.5, 172.9, 
    154.1, 141.9, 111.3, 78.2, 118.9, 168.1, 26.1, 160.6, 78.1, 
    74.8, 36.5, 152.4, 39.8, 116.1, 56.2, 51.3, 69.7, 34.9, 35.5, 
    31.2, 57, 49, 64, 54.2, 30.5, 47.2, 63, 65.3, 27.8, 26.5, 
    24.2, 32.9, 33.4, 33.6, 68.9, 70, 18.4, 33.2, 31.4, 23.5, 
    40.7, 21, 51.9, 23.3)), row.names = c(NA, -450L), class = "data.frame")

理想情况下,生成的数据框一列代表月份,一列代表网站,每个月和网站组合 30 列(即,使数据框从长到宽)。

Desireable output

你可以试试tidyverse

library(tidyverse)
df %>% 
  as_tibble() %>% 
  group_by(month, site) %>% 
  mutate(index=1:n()) %>% 
  spread(index, length)
# A tibble: 15 x 32
# Groups:   month, site [15]
   month site    `1`   `2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`  `10`  `11`  `12`  `13`  `14`  `15`  `16`  `17`  `18`
   <dbl> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1     1 port   14.5   8     9.6  11.3  16.8  13.4  13.3  16.1  12.1   9.5  13.6   9.5  20.1  19    21.8  14    13.6  16.4
 2     1 bluff  14    18.7  13.5  15.2  16.5  19.3   6.5  19.8  17    19.1  14.5  14.1  10.1  15.4  14.3  13.4   4.8  15.4
 3     1 palme   0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0  
 4     2 port   36.4  51.5  56    35.1  35.5  31.1  39.9  55.4  39.4  72    48    15.7  40.0  21.3  25.9  42.2  25.2  60  
 5     2 bluff  45.5  34.5  23.5  41    32.1  21.9  52.1  25.1  19    57.8  46.5  26.8  64.5  65    68    69.4  13.2  71.6
 6     2 palme  28.8  72.3  21    58.7  52.5  34.7  61    29.1  47.9  60.1  73.4  38.8  64.2  60.4  35.6  53.6  66.4  75.1
 7     3 port  108.   84.4 100    33.0  43   132   144.  101.  106.   87.7 114.   25   123   127.   61.2  94   126    98.8
 8     3 bluff  55.8 123   144.   88.2  48.3  56.1 159   111.  170.   69    77.6  67.9  69.8  18.1  96.8 117.  124.   25.2
 9     3 palme  54.9  56.5  50    36.2  49.8  46.4  36    38.3  28.4  96.2 118.  133.   98.5 140.  145   145.  124.   59.2
10     4 port   47.4  54.2  78.4  98.5  47.1  55.3 122.   34.5  60.2  64.5  44.9  71    66.3  33.6  33.7  61.7  38.5  44.9
11     4 bluff  54.3  40.6 139.   56    87.2  82.5  53    77.5  63.5  73.8  43.1  35.3 139    77.6  77.9  91    48.2 121. 
12     4 palme  38.2  25.4  26.3  82   106.   83.3  99.8 103.  108.   71.6  69.3  68.5 129.  143.  126.  173.  154.  142. 
13     5 port    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0  
14     5 bluff   0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0  
15     5 palme  56.2  51.3  69.7  34.9  35.5  31.2  57    49    64    54.2  30.5  47.2  63    65.3  27.8  26.5  24.2  32.9
# ... with 12 more variables: `19` <dbl>, `20` <dbl>, `21` <dbl>, `22` <dbl>, `23` <dbl>, `24` <dbl>, `25` <dbl>, `26` <dbl>,
#   `27` <dbl>, `28` <dbl>, `29` <dbl>, `30` <dbl>