我试图计算一个百分比总计,比如说,下面这个可重复的例子:
structure(c(197.95, 197.95, 197.95, 186.8, 190.51, 195.16, 199.81,
202.59, 202.59, 202.59, 92.28, 92.28, 90.07, 89.82, 87.36, 87.61,
90.56, 89.82, 90.07, 89.82, 20.43, 20.43, 20.43, 20.43, 20.43,
20.43, 20.43, 20.43, 20.43, 20.64, 24.7, 24.95, 24.54, 23.97,
23.97, 24.38, 24.38, 24.38, 24.54, 24.54, 37.4, 37.4, 37.4, 35.43,
35.43, 35.43, 35.43, 35.43, 35.43, 39.37, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 16.05,
16.05, 16.05, 16.05, 15.62, 15.62, 16.05, 15.62, 15.62, 15.62,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), index = structure(c(470620800,
470880000, 470966400, 471052800, 471139200, 471225600, 471484800,
471571200, 471657600, 471744000), tzone = "UTC", tclass = "Date"), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", class = c("xts",
"zoo"), .Dim = c(10L, 9L), .Dimnames = list(NULL, c("AVON", "BA.",
"CMRG", "COB", "MGGT", "QQ.", "RR.", "SNR", "ULE")))
我需要返回相同的数据表示,但每个值都是它所属行总数的百分比。我做了很多研究并尝试了prop.table
,它返回subscript
错误,最后我使用rowPercents
这是RcmdrMisc
包的一部分。但是,我找不到如何让它忽略我的数据集中的NA
。
在示例中提供了两列NA
的整列。我不能删除它们,因为整个数据集具有后续行的一些值。
请注意,我的示例的类是zoo
和xts
答案 0 :(得分:2)
您不需要任何外部包。
dat.percent <- dat / rowSums(dat, na.rm = T) * 100
检查它是否有效:
> all(abs(rowSums(dat.percent, na.rm = T) - 100) < 0.0001)
[1] TRUE
答案 1 :(得分:0)
prop.table
似乎不适用于xts / zoo对象,但这可行:
library(xts)
prop.table(coredata(x), 1)
它返回所有正确的NA,因为每行中都有一个NA(并且在不知道每个值的情况下无法计算比例)。如果您想将NA值视为零,则:
prop.table( na.fill(coredata(x), 0), 1)