2013-05-14 158 views
1

我需要根據兩個因素創建一個基於變量的變量(人們希望這是可能的)。按因子分解數據

比方說,我有數據:使用性別和具體agegroup中值(例如,當agegroup = 1,性別= 1,中位數

d <- data.frame ( 
    agegroup = c(2,1,1,2,3,2,1,3,3,3,3,3,1,1,2,3,2,1,1,2,1,2,2,3) , 
    gender = c(2,2,2,2,2,2,1,2,1,1,1,2,1,1,2,2,1,1,1,1,2,1,1,1) , 
    hourwalking = c(0.3,0.5,1.1,1.1,1.1,1.2,1.2,1.2,1.3,1.5,1.7,1.8,2.1,2.1,2.2,2.2,2.3,2.4,2.4,3,3.1,3.1,4.3,5)   
    ) 

我想創建一個二進制文件(LowWalkHrs) = 2.1(使用excel發現中位數))。所述LowWalkHrs將數據集中的一個附加的變量,所以輸出將是:

 agegroup gender hourwalk LowWalkHrs 
     2  2  0.3  1 
     1  2  0.5  1 
     1  2  1.1  0 
     2  2  1.1  1 
     3  2  1.1  1 
     2  2  1.2  0 
     1  1  1.2  1 
      .... 
     3  1  5   0 

我有一個相當大的數據集(〜10K的觀察結果),所以Excel是不可能的。

在R我試過cut和cut2,這似乎沒有采取因子變量,以及ddply,它給了我一個錯誤信息(錯誤$<-.data.frame*tmp*,「lowWalkHrs」,value = list( hourwalking = C(0.63:更換有949行,數據擁有11303)

回答

1

我懷疑這可能是緩慢的,但我認爲它的工作原理:

z <- mapply(d$agegroup, d$gender, d$hourwalking, FUN=function(a,g,h) 
    as.numeric(h < median(d$hourwalking[d$agegroup==a & d$gender==g]))) 
+0

它確實有效,我還沒有在較大的數據集上嘗試過,但我會。謝謝! – user2382532 2013-05-14 17:19:47

+0

好吧,用較大的數據集嘗試它,並且我得到錯誤消息:在mapply中出錯(d $ agegroup,d $ gender,d $ hourwalking,: )零長度輸入不能與非零長度的輸入混合。我確實在我的大數據集中缺少數據,這是什麼原因導致了錯誤? – user2382532 2013-05-14 17:23:36

+0

是的,'[...]'中的東西在缺失值時不能正常工作 – Thomas 2013-05-14 17:28:22

2
d <- data.frame ( 
    agegroup = c(2,1,1,2,3,2,1,3,3,3,3,3,1,1,2,3,2,1,1,2,1,2,2,3) , 
    gender = c(2,2,2,2,2,2,1,2,1,1,1,2,1,1,2,2,1,1,1,1,2,1,1,1) , 
    hourwalking = c(0.3,0.5,1.1,1.1,1.1,1.2,1.2,1.2,1.3,1.5,1.7,1.8,2.1,2.1,2.2,2.2,2.3,2.4,2.4,3,3.1,3.1,4.3,5)   
    ) 

d$LowWalkHrs=1*with(d,hourwalking<ave(hourwalking,list(factor(agegroup,exclude=NULL),factor(gender,exclude=NULL)),FUN=median)) 

因子(...排除= NULL)添加用於將NA作爲單獨的組來處理。

+0

完美 - 謝謝! – user2382532 2013-05-15 15:41:42