2

私は以下に示すようなデータフレームを持っており、車種ごとの負傷者の数をリストしています。

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,])

上記のようなデータフレームの結果になりたいのですが、それを理解しようと混乱しているだけです。

4

4 に答える 4

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)行列をベクトルで除算すると、操作は列単位で行われるため、行列を転置する必要があることに注意してください(を参照)。

于 2011-04-06T02:41:34.137 に答える
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
于 2011-04-06T03:35:14.420 に答える
2

行列に変換されていないPrasadソリューションの一部のバージョン。

trqldnum/trqldnum[1,][rep(1,nrow(trqldnum)),]
于 2011-04-06T05:20:04.113 に答える
2

どうですか

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

データフレームのunlist最初の行をスイープ可能なベクトルに変換するために必要です...

于 2011-04-06T15:54:04.007 に答える