【问题标题】:R: reshape elements of a data frame keeping order of variables in sequenceR:重塑数据框的元素,保持变量的顺序
【发布时间】:2017-12-12 23:24:40
【问题描述】:

我正在努力重塑 12 个单独的列表元素 [它们采用数据框格式] 并使值保持正确的顺序。这些是按天进行的测量,value 1 对应于每月的第一天测量,依此类推,直到 value 31,最大可能的天数/月。这是在一个水平。对于少于 31 天的缺失测量/月,将出现 -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 1、value 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 天的值。

【问题讨论】:

    标签: r list dataframe reshape


    【解决方案1】:

    使用 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
    

    【讨论】:

    • 太好了,谢谢!其他用户应该注意的是,我确实必须将 mutate 函数更改为“value”而不是“value\\”。由于 tibbles 格式标题的方式,它最初使 DAY 列填充 NA。
    • @adgelov,是的,它没有在我的代码中明确显示。但是,read.table 正在生成一个标准数据框,该数据框保留了提供的列名,并且我已将 as_tibble 添加到该管道中。如果最初创建为 tibble,这些列名将不会被视为 有效。
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2020-06-09
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多