使用 Reshape() 将数据重塑为宽格式,而不是 dcast 或 pivot 函数

reshaping data using reshape() to wide format instead of dcast or pivot functions

提问人:TheBoomerang 提问时间:5/5/2023 最后编辑:PhilTheBoomerang 更新时间:5/5/2023 访问量:46

问:

我在理解重塑函数时遇到了一些问题,并希望专门使用它,因为它使用基本 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 个月是它们自己的列,而不是行/观察值。

任何帮助将不胜感激。我尝试过查看其他示例,但似乎无法理解它。

r 重塑 长整型 dcast

评论


答:

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