繁体   English   中英

从长到宽重塑数据 - 了解重塑参数

[英]Reshape Data Long to Wide - understanding reshape parameters

我有一个长格式的数据框狗,我正在尝试使用 reshape() 函数将其重新格式化为宽格式。 目前看起来是这样的:

dogid  month  year  trainingtype  home  school  timeincomp
12345  1      2014  1             1     1       340
12345  2      2014  1             1     1       360
31323  12     2015  2             7     3       440
31323  1      2014  1             7     3       500
31323  2      2014  1             7     3       520

dogid 列是一堆 id,每只狗一个。 对于 12 个月,月份列从 1 到 12 变化,从 2014 年到 2015 年。Trainingtype 变化为 1 到 2。每只狗都有一个 timeincomp 值,用于每个月-年-trainingtype 组合,因此每只狗有 48 个条目。 家和学校从 1 到 8 不等,每只狗都是恒定的(同一只狗的每个条目都有相同的学校和家)。 comp 中的时间是我的响应变量。

我希望我的桌子看起来像这样:

dogid  home  school  month1year2014trainingtype1  month2year2014trainingtype1
12345  1     1       340                          360
31323  7     3       500                          520

等(每个月-年-培训类型组合的列)

我应该在重塑中使用哪些参数来实现这一目标?

您可以使用dcast包中的reshape2函数。 更容易理解。 公式的左边是留长的那边,右边是变宽的那边。

fun.aggregate是在每种情况下有多个数字的情况下应用的功能。 如果您确定没有重复的个案,则可以使用meansum

dcast(data, formula= dogid + home + school ~ month + year + trainingtype,
value.var = 'timeincomp',
fun.aggregate = sum)

我希望它能起作用:

  dogid home school 1_2014_1 2_2014_1 12_2015_2
1 12345    1      1      340      360         0
2 31323    7      3      500      520       440

在这种情况下,使用base reshape ,您实际上需要三个时间变量的interaction()来定义您的宽变量,因此:

idvars  <- c("dogid","home","school")
grpvars <- c("year","month","trainingtype")
outvar  <- "timeincomp"
time    <- interaction(dat[grpvars])

reshape(
  cbind(dat[c(idvars,outvar)],time),
  idvar=idvars,
  timevar="time",
  direction="wide"
)

#  dogid home school timeincomp.2014.1.1 timeincomp.2014.2.1 timeincomp.2015.12.2
#1 12345    1      1                 340                 360                   NA
#3 31323    7      3                 500                 520                  440

您可以使用新的替代品reshape2 tidyr来执行相同的操作:

library(tidyr)
library(dplyr)
data %>% unite(newcol, c(year, month, trainingtype)) %>%
         spread(newcol, timeincomp)

  dogid home school 2014_1_1 2014_2_1 2015_12_2
1 12345    1      1      340      360        NA
2 31323    7      3      500      520       440

首先,我们将year,month和trainingtype列合并到一个名为newcol的新列中,然后使用timeincomp作为我们的值变量来分布数据。

NA在那里,因为我们没有值,您可以通过在散布函数中更改fill = NA来给它一个值。

对于 tidyr_1.0.0 及以上版本,另一个选项是 pivot_wider

library(tidyverse)

df <- tribble(
~dogid, ~month, ~year, ~trainingtype, ~home, ~school, ~timeincomp,
12345,  1,  2014, 1, 1, 1, 340,
12345,  2,  2014, 1, 1, 1, 360,
31323,  12, 2015, 2, 7, 3, 440,
31323,  1,  2014, 1, 7, 3, 500,
31323,  2,  2014, 1, 7, 3, 520
)


df %>% pivot_wider(
  id_cols = c(dogid,home, school),
  names_from = c(month, year, trainingtype),
  values_from = c(timeincomp),
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM