2015-08-26 73 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