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 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 天的值。
使用 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
我正在努力重塑 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 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 天的值。
使用 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