提问人:TheBoomerang 提问时间:5/5/2023 最后编辑:PhilTheBoomerang 更新时间:5/5/2023 访问量:46
使用 Reshape() 将数据重塑为宽格式,而不是 dcast 或 pivot 函数
reshaping data using reshape() to wide format instead of dcast or pivot functions
问:
我在理解重塑函数时遇到了一些问题,并希望专门使用它,因为它使用基本 r。
请考虑以下代码
month <- c("jan", "feb", "mar", "apr")
hours <- c(40, 40, 35, 37)
days <- c(31, 28, 31, 30)
dat <- data.frame(month, hours, days)
在上面的例子中,月、小时和天是列,但我想转换它,以便“小时”和“天”是列中的行,“月”列中的 4 个月是它们自己的列,而不是行/观察值。
任何帮助将不胜感激。我尝试过查看其他示例,但似乎无法理解它。
答:
0赞
dandrews
5/5/2023
#1
我不怎么使用这个功能,但网络上有很多关于它的教程。这是一个帮助我想出这个答案的人。https://www.datasciencemadesimple.com/reshape-in-r-from-wide-to-long-from-long-to-wide/
也许这就是您正在寻找的输出?
reshape(data = dat,
idvar = 'month',
varying = c('hours','days'),
v.names = 'value',
times = c('hours','days'),
direction = 'long')
虽然你说你想使用,但这里有一个整洁的解决方案(不知道你为什么要避免它?reshape
library(tidyverse)
dat %>%
pivot_longer(cols = !month,
names_to = 's',
values_to = 'y')
1赞
C. Murtaugh
5/5/2023
#2
我认为你正在做的是旋转,也就是转置,数据帧,而不是重塑它,你可以得到你想要的东西,或者,更花哨的,t(dat)
dat.t <- as.data.frame(t(dat)[2:3,])
names(dat.t) <- t(dat)[1,]
print(dat.t)
这为您提供了:
jan feb mar apr
hours 40 40 35 37
days 31 28 31 30
评论
1赞
dandrews
5/5/2023
看来我可能误解了这个问题!这是有道理的。@TheBoomerang添加预期输出的示例会有所帮助,而不仅仅是描述,但我认为这解决了您的问题
0赞
Andre Wildberg
5/5/2023
#3
如果数据是长格式或宽格式,则重塑是有意义的
将数据转换为长格式
dd <- cbind(stack(dat[,-1]), month = dat[,1])
dd
values ind month
1 40 hours jan
2 40 hours feb
3 35 hours mar
4 37 hours apr
5 31 days jan
6 28 days feb
7 31 days mar
8 30 days apr
然后重塑为宽
reshape(dd, timevar="month", idvar="ind", direction="wide")
ind values.jan values.feb values.mar values.apr
1 hours 40 40 35 37
5 days 31 28 31 30
评论