将宽数据重塑为长格式

时间:2021-07-04 11:00:59

标签: r aggregate reshape melt

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

等等...

2 个答案:

答案 0 :(得分:0)

您可以使用 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)

答案 1 :(得分:0)

经过一番搜索,想出了一个使用 melt 的解决方案。虽然,不能完全使用融化完成。 ordergsub 一起使用以获得准确的输出。也许这对某人有用。如果需要改进,请随时进行编辑。

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)