使用reform()而不是dcast或pivot函数将数据整形为宽格式

wbgh16ku  于 2023-05-11  发布在  其他
关注(0)|答案(3)|浏览(115)

我在理解reshape函数时遇到了一些问题,我想特别使用它,因为它使用了base 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)

在上面的例子中,month,hours和days是列,但我想转换一下,这样“hours”和“days”是列中的行,“month”列中的4个月是它们自己的列,而不是行/观察。
任何帮助将不胜感激。我试着看过其他的例子,但似乎不能让我的头周围。

anhgbhbe

anhgbhbe1#

我认为你所做的是旋转,又名转置, Dataframe ,而不是重塑它,你可以得到你想要的只是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
zpqajqem

zpqajqem2#

我不怎么使用这个函数,但是网上有很多关于它的教程。这里有一个帮助我想出这个答案。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,这里有一个tidyverse解决方案(不知道为什么你想避免它?)

library(tidyverse)
dat %>% 
  pivot_longer(cols = !month,
               names_to = 's',
               values_to = 'y')
cvxl0en2

cvxl0en23#

如果数据是长格式或宽格式,则整形是有意义的
将数据转换为长格式

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

相关问题