【问题标题】:Reshape wide data to long format [duplicate]将宽数据重塑为长格式[重复]
【发布时间】:2021-09-15 12:30:12
【问题描述】:

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

等等……

【问题讨论】:

标签: r aggregate reshape melt


【解决方案1】:

您可以使用来自tidyrpivot_longer 执行此操作-

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)

【讨论】:

  • 如何将此输出写入另一个 csv 文件?
  • 你可以使用write.csv来写文件。查看更新的答案。
  • 哇!这就是我想要的。我还添加了额外的 values_to='variable_name' 以在输出中获取我想要的变量名称。
  • 我仍然很想知道使用melt的解决方案
【解决方案2】:

经过一番搜索,想出了一个使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2012-02-18
    • 2017-10-13
    • 2017-07-19
    相关资源
    最近更新 更多