问题描述
我在使用 reshape
melt
将宽数据改造成长格式时遇到了麻烦。但我找不到最适合我需要的解决方案。对不起,如果我重复这个问题。我的单个变量的月度数据(CSV 文件)格式如下;
Date level1 level2 level3 level4 ..... level100
1/1/2003 191.3 191.4 191.4 191.4
1/2/2003 184.3 184.3 184.3 184.3
1/3/2003 176.5 176.5 176.5 176.5
1/4/2003 175.5 175.5 175.5 175.5
..
..
1/12/2003
我正在尝试以这种格式重塑
Date Level value
1/1/2003 1 191.3
1/1/2003 2 191.4
.. .. ..
1/1/2003 100 #value
1/2/2003 1 #value
1/2/2003 2 #value
..
1/2/2003 100 #value
等等...
解决方法
您可以使用 pivot_longer
中的 tidyr
-
result <- tidyr::pivot_longer(df,cols = -Date,names_to = 'Level',names_pattern = 'level(\\d+)'
)
result
# Date Level value
# <chr> <chr> <dbl>
# 1 1/1/2003 1 191.
# 2 1/1/2003 2 191.
# 3 1/1/2003 3 191.
# 4 1/1/2003 4 191.
# 5 1/2/2003 1 184.
# 6 1/2/2003 2 184.
# 7 1/2/2003 3 184.
# 8 1/2/2003 4 184.
# 9 1/3/2003 1 176.
#10 1/3/2003 2 176.
#11 1/3/2003 3 176.
#12 1/3/2003 4 176.
#13 1/4/2003 1 176.
#14 1/4/2003 2 176.
#15 1/4/2003 3 176.
#16 1/4/2003 4 176.
要将输出写入 csv 使用 write.csv
-
write.csv(result,'result.csv',row.names = FALSE)
,
经过一番搜索,想出了一个使用 melt
的解决方案。虽然,不能完全使用融化完成。 order
和 gsub
一起使用以获得准确的输出。也许这对某人有用。如果需要改进,请随时进行编辑。
Date=as.Date(d$Date,format='%d%m%Y')
df_melt <- melt(d,id.vars = c("Date"),variable.name = "Level",value.name = "name_of_interest",measure.vars = names(d[,2:101]))
b<- df_melt[order(as.Date(df_melt$Date,format="%d/%m/%Y")),] # to get the date in order
b$Level<-gsub("level","",as.numeric(b$Level)) # to remove the string "level"
write.csv(b,"result.csv",row.names = FALSE)