2015-08-26 32 views
3

我有一个长格式的数据帧的狗,我试图重新格式化使用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列是一串IDS,每个狗一个。月份列在12个月内变化1至12,2014年至2015年间变化不大。训练类型的变化范围为1至2.每只狗都有每个月每年训练类型组合的时间差值,因此每只狗有48个入场点。家庭和学校在1-8岁之间不等,每只狗的体重不变(同一只狗的每次入学都有相同的学校和家庭)。 comp中的时间是我的回应变量。

我想我的表看起来像这样:

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

等(与列每个月年trainingtype组合)

我应该在重塑使用什么参数来实现这一目标?

回答

5

您可以使用包reshape2中的函数dcast。这很容易理解。公式的左边是一个停留很久的公式,而右边是那个走得很宽的公式。

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 
3

您可以使用新的替代做同样的事情reshape2tidyr

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 

首先,我们团结的年,月,trainingtype列插入新列名为NEWCOL,那么我们传播timeincomp的数据作为我们的值变量。

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

+0

我还是不习惯tidyr,并试图结合用spread()收集(),但没有看到'unite()是必要的!谢谢! –

3

在这种情况下,使用基本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