apply()并计算所有数据帧行的第一行比例

r rows apply divide

2114 观看

4回复

70503 作者的声誉

我有一个如下所示的数据框,列出了车辆类型的伤害数量:

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

我更喜欢最终得到如上所述的数据帧结果,但我只是陷入混乱中试图找出它。

作者: thelatemail 的来源 发布者: 2011 年 4 月 6 日

回应 (4)


3

15736 作者的声誉

将数据帧转换为矩阵并使用矩阵运算:

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)),因为当您使用向量划分矩阵时,操作将按列完成。

作者: Prasad Chalasani 发布者: 06.04.2011 02:41

3

51684 作者的声誉

我喜欢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
作者: Chase 发布者: 06.04.2011 03:35

2

5822 作者的声誉

某些版本的Prasad解决方案无需转换为矩阵。

trqldnum/trqldnum[1,][rep(1,nrow(trqldnum)),]
作者: Wojciech Sobala 发布者: 06.04.2011 05:20

2

139046 作者的声誉

决定

怎么样

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

unlist需要将数据帧的第一个行转换成可被扫过的矢量...

作者: Ben Bolker 发布者: 06.04.2011 03:54
32x32