Reshape Data Long to Wide——理解重塑参数
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 值,因此每只狗有 48 个条目。家庭和学校从 1-8 不等,并且每只狗都是不变的(同一只狗的每个条目都有相同的学校和家庭)。 comp 中的时间是我的响应变量。
我希望我的 table 看起来像这样:
dogid home school month1year2014trainingtype1 month2year2014trainingtype1
12345 1 1 340 360
31323 7 3 500 520
等(每个月-年-培训类型组合都有列)
我应该在 reshape 中使用什么参数来实现这个?
您可以使用程序包 reshape2
中的函数 dcast
。它更容易理解。公式的左边是留长的,右边是变宽的。
fun.aggregate 是在每个案例超过 1 个数字的情况下应用的功能。如果你确定你没有重复的案例,你可以使用 mean
或 sum
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
您可以使用 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
首先,我们将年、月和训练类型列合并到一个名为 newcol 的新列中,然后我们将数据以 timeincomp 作为我们的值变量。
NA 在那里,因为我们没有价值,您可以通过在传播函数中更改 fill = NA
来给它一个。
在这种情况下,使用基数 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
对于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),
)
我有一个长格式数据框狗,我正在尝试使用 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 值,因此每只狗有 48 个条目。家庭和学校从 1-8 不等,并且每只狗都是不变的(同一只狗的每个条目都有相同的学校和家庭)。 comp 中的时间是我的响应变量。
我希望我的 table 看起来像这样:
dogid home school month1year2014trainingtype1 month2year2014trainingtype1
12345 1 1 340 360
31323 7 3 500 520
等(每个月-年-培训类型组合都有列)
我应该在 reshape 中使用什么参数来实现这个?
您可以使用程序包 reshape2
中的函数 dcast
。它更容易理解。公式的左边是留长的,右边是变宽的。
fun.aggregate 是在每个案例超过 1 个数字的情况下应用的功能。如果你确定你没有重复的案例,你可以使用 mean
或 sum
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
您可以使用 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
首先,我们将年、月和训练类型列合并到一个名为 newcol 的新列中,然后我们将数据以 timeincomp 作为我们的值变量。
NA 在那里,因为我们没有价值,您可以通过在传播函数中更改 fill = NA
来给它一个。
在这种情况下,使用基数 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
对于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),
)