r - 使用 2 个变量将数据帧从宽转换为长

标签 r reshape2 melt

我有以下宽数据框(mydf.wide):

DAY JAN F1  FEB F2  MAR F3  APR F4  MAY F5  JUN F6  JUL F7  AUG F8  SEP F9  OCT F10 NOV F11 DEC F12
1   169 0   296 0   1095    0   599 0   1361    0   1746    0   2411    0   2516    0   1614    0   908 0   488 0   209 0
2   193 0   554 0   1085    0   1820    0   1723    0   2787    0   2548    0   1402    0   1633    0   897 0   411 0   250 0
3   246 0   533 0   1111    0   1817    0   2238    0   2747    0   1575    0   1912    0   705 0   813 0   156 0   164 0
4   222 0   547 0   1125    0   1789    0   2181    0   2309    0   1569    0   1798    0   1463    0   878 0   241 0   230 0

我想制作以下“半长”:
DAY variable_month value_month value_F
1 JAN 169 0

我试过:
library(reshape2)
mydf.long <- melt(mydf.wide, id.vars=c("YEAR","DAY"), measure.vars=c("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"))

但这跳过了 F 变量,我不知道如何处理两个变量......

最佳答案

这是 reshape(...) 的情况之一。在基础 R 中是一个更好的选择。

months    <- c(2,4,6,8,10,12,14,16,18,20,22,24)   # column numbers of months
F         <- c(3,5,7,9,11,13,15,17,19,21,23,25)   # column numbers of Fn
mydf.long <- reshape(mydf.wide,idvar=1,
             times=colnames(mydf.wide)[months],
             varying=list(months,F),
             v.names=c("value_month","value_F"),
             direction="long")
colnames(mydf.long)[2] <- "variable_month"
head(mydf.long)
#       DAY variable_month value_month value_F
# 1.JAN   1            JAN         169       0
# 2.JAN   2            JAN         193       0
# 3.JAN   3            JAN         246       0
# 4.JAN   4            JAN         222       0
# 1.FEB   1            FEB         296       0
# 2.FEB   2            FEB         554       0

您也可以通过两次调用 melt(...) 来做到这一点。
library(reshape2)
months    <- c(2,4,6,8,10,12,14,16,18,20,22,24)   # column numbers of months
F         <- c(3,5,7,9,11,13,15,17,19,21,23,25)   # column numbers of Fn
z.1 <- melt(mydf.wide,id=1,measure=months,
            variable.name="variable_month",value.name="value_month")
z.2 <- melt(mydf.wide,id=1,measure=F,value.name="value_F")
mydf.long <- cbind(z.1,value_F=z.2$value_F)
head(mydf.long)
#   DAY variable_month value_month z.2$value_F
# 1   1            JAN         169           0
# 2   2            JAN         193           0
# 3   3            JAN         246           0
# 4   4            JAN         222           0
# 5   1            FEB         296           0
# 6   2            FEB         554           0

关于r - 使用 2 个变量将数据帧从宽转换为长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22073004/

相关文章:

r - 按钮提交 R 与 Shiny

用melt reshape 数据

javascript - 在 x = 0 时执行 Math.pow(10,x) 时使用 javascript 更改 R Shiny 错误中的 noUIslider 标签

r - R-geom_density()使用哪种算法,以及如何提取曲线的点/等式?

r - 将熔化与矩阵或data.frame一起使用可提供不同的输出

r - 修改ggplot2中的图例

r - R 中的 reshape2 中是否有与 'melt' 类似的功能,可在 MatLab 中使用?

r - 如何 reshape 长格式数据并计算值

r - 绘制非数字数据

R 使用 dcast、melt 和 concatenation reshape 数据框