R:重塑数据框的元素,按顺序保持变量的顺序

R: reshape elements of a data frame keeping order of variables in sequence

我正在努力重塑 12 个单独的列表元素 [采用数据框格式] 并使值保持正确的顺序。这些是按天计算的测量值,value 1 对应于该月测量值的第一天,依此类推直到 value 31,最大可能值 days/month。这是横向的。对于少于 31 天的缺失 measurements/months,将显示 -9999-9999 不是这里的问题。

> myplist[[1]]
     COOPID YEAR MONTH ELEMENT value 1 value 2 value 3 value 4 value 5 value 6 
3    170100 1982     9    PRCP       0      70      15       0       0       0       
8    170100 1982    10    PRCP       0      10       0       0       0       0       
13   170100 1982    11    PRCP       2      13       0     170       0       5       
18   170100 1982    12    PRCP       0       0       0       0       2       5       
23   170100 1983     1    PRCP       2       0       0       0       0      10       
28   170100 1983     2    PRCP   -9999       0       0      52       6       0  

我的目标是让列表元素垂直排列,这样每一天都有自己的行,所以它看起来像这样:

> myplist[[1]]
    YEAR MONTH DAY PRCP
    1982     9   1    0
    1982     9   2   70
    1982     9   3   15

我试过这段代码:

melt(myplist[[1]], id.vars = c("COOPID", "YEAR", "MONTH", "ELEMENT"))

但它列出了每个月的 value 1 而不是 value 1value 2、...、value 31.

的所需顺序
      COOPID YEAR MONTH ELEMENT variable value
1     170100 1982     9    PRCP  value 1     0
2     170100 1982    10    PRCP  value 1     0
3     170100 1982    11    PRCP  value 1     2
4     170100 1982    12    PRCP  value 1     0
5     170100 1983     1    PRCP  value 1     2

并且这段代码返回了这个不需要的输出和错误:

> reshape(myplist[[1]], idvar = c("YEAR","MONTH"),varying =print(paste0("value",1:31)),sep = "",
+         timevar = c("YEAR","MONTH"),direction = "long")
 [1] "value1"  "value2"  "value3"  "value4"  "value5"  "value6"  "value7"  "value8"  "value9"  "value10"
[11] "value11" "value12" "value13" "value14" "value15" "value16" "value17" "value18" "value19" "value20"
[21] "value21" "value22" "value23" "value24" "value25" "value26" "value27" "value28" "value29" "value30"
[31] "value31"
Error in `[.data.frame`(data, , varying.i) : undefined columns selected

我也试过 dcast 无济于事,在这个网站和其他网站上提出的其他问题似乎也没有解决我遇到的问题。我认为问题的根源是我的年份范围每个月的天数是可变的(到给定月份的实际最后一天),但我的测量数据中的每个月无论如何都有 31 天的值。

使用 tidy 方法,我会将值列 gather 转换为长格式,然后 gsub 成为月份中的某天。

library(tidyr)
library(dplyr)

df <- read.table(text = "
     COOPID YEAR MONTH ELEMENT 'value 1' 'value 2' 'value 3' 'value 4' 'value 5' 'value 6'
     170100 1982     9    PRCP         0        70        15         0         0         0
     170100 1982    10    PRCP         0        10         0         0         0         0
     170100 1982    11    PRCP         2        13         0       170         0         5
     170100 1982    12    PRCP         0         0         0         0         2         5
     170100 1983     1    PRCP         2         0         0         0         0        10
     170100 1983     2    PRCP     -9999         0         0        52         6         0
                 ", header = TRUE, stringsAsFactors = FALSE) %>% as_tibble

df %>%
  select(-ELEMENT) %>%
  gather(DAY, PRCP, -c(COOPID, YEAR, MONTH)) %>%
  mutate(DAY = as.integer(gsub("value\.", "", DAY))) %>%
  arrange(COOPID, YEAR, MONTH, DAY)

# # A tibble: 36 x 5
#    COOPID  YEAR MONTH   DAY  PRCP
#     <int> <int> <int> <int> <int>
#  1 170100  1982     9     1     0
#  2 170100  1982     9     2    70
#  3 170100  1982     9     3    15
#  4 170100  1982     9     4     0
#  5 170100  1982     9     5     0
#  6 170100  1982     9     6     0
#  7 170100  1982    10     1     0
#  8 170100  1982    10     2    10
#  9 170100  1982    10     3     0
# 10 170100  1982    10     4     0
# # ... with 26 more rows