我有一个如下所示的数据框,列出了车辆类型的伤害数量:
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,])
我希望最终得到如上所述的数据框结果,但我只是陷入混乱中试图找出它。
答案 0 :(得分: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)
),因为当您用矢量划分矩阵时,操作是按列完成的。
答案 1 :(得分: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 :(得分:2)
某些版本的Prasad解决方案没有转换为矩阵。
trqldnum/trqldnum[1,][rep(1,nrow(trqldnum)),]
答案 3 :(得分:2)
怎么样
sweep(trqldnum,2,unlist(trqldnum[1,]),"/")
需要unlist
才能将数据框的第一行转换为可以扫描的矢量...