2011-04-06 62 views
2

我有一個數據幀如下圖所示車輛類型上市受傷人數:適用()和calcuating所有數據幀行第一行的比例

trqldnum <- data.frame(motorveh=c(796,912,908,880,941,966,989,984), 
         motorcyc=c(257,295,326,313,403,389,474,496), 
         bicyc=c(109,127,125,137,172,146,173,178)) 
trqldnum 

# motorveh motorcyc bicyc 
#1  796  257 109 
#2  912  295 127 
#3  908  326 125 
#4  880  313 137 
#5  941  403 172 
#6  966  389 146 
#7  989  474 173 
#8  984  496 178 

目前我計算第一的比例每個車型使用:

trqldprop <- t(apply(trqldnum,1,function(x) { 
       x/c(trqldnum[1,1],trqldnum[1,2],trqldnum[1,3]) 
       })) 
trqldprop 

# motorveh motorcyc bicyc 
#1 1.000000 1.000000 1.000000 
#2 1.145729 1.147860 1.165138 
#3 1.140704 1.268482 1.146789 
#4 1.105528 1.217899 1.256881 
#5 1.182161 1.568093 1.577982 
#6 1.213568 1.513619 1.339450 
#7 1.242462 1.844358 1.587156 
#8 1.236181 1.929961 1.633028 

這似乎有點難看,如果數據改變形狀,我需要手動更改函數的分母。如果我嘗試在apply()語句中使用以下內容,我最終會在列表的列表中顯示輸出。

function(x) x/c(trqldnum[1,]) 

我寧願結束與上面的數據幀結果,但我只是在試圖弄清楚它的混亂。

回答

2

如何

sweep(trqldnum,2,unlist(trqldnum[1,]),"/") 

unlist需要將數據幀的第一個行轉換成可以被席捲一矢量...

3

轉換的數據幀矩陣和使用矩陣運算:

m <- as.matrix(trqldnum) 

trqldprop <- as.data.frame(t(t(m)/m[1,])) 

> trqldprop 
    motorveh motorcyc bicyc 
1 1.000000 1.000000 1.000000 
2 1.145729 1.147860 1.165138 
3 1.140704 1.268482 1.146789 
4 1.105528 1.217899 1.256881 
5 1.182161 1.568093 1.577982 
6 1.213568 1.513619 1.339450 
7 1.242462 1.844358 1.587156 
8 1.236181 1.929961 1.633028 

請注意,我們需要轉置矩陣(見t(m)),因爲當你用一個矢量分割矩陣,操作按列方式完成。

+0

尼斯的答案,如果我有足夠的聲譽我想你+1。我承認我對矩陣運算不太熟悉,所以我現在有一個話題要在今天進行閱讀。 – thelatemail 2011-04-06 04:11:31

3

我喜歡plyr這些任務,因爲它們允許您指定輸出的格式。你可以把它變成一個函數,它可以輕鬆地擴展到更多的列和不同的基本級別。

FUN <- function(dat, baseRow = 1){ 
    require(plyr) 
    divisors <- dat[baseRow ,] 
    adply(dat, 1, function(x) x/divisors) 
} 

FUN(trqldnum, 1) 

    motorveh motorcyc bicyc 
1 1.000000 1.000000 1.000000 
2 1.145729 1.147860 1.165138 
3 1.140704 1.268482 1.146789 
4 1.105528 1.217899 1.256881 
5 1.182161 1.568093 1.577982 
6 1.213568 1.513619 1.339450 
7 1.242462 1.844358 1.587156 
8 1.236181 1.929961 1.633028 
2

某些版本的Prasad解決方案無需轉換爲矩陣。

trqldnum/trqldnum[1,][rep(1,nrow(trqldnum)),] 
+0

在今天重複類似的分析之後,我意識到這可以通過使用... trqldnum/trqldnum [rep(1,nrow(trqldnum))]進一步簡化,] – thelatemail 2011-09-20 00:05:56

相關問題