我有一个data.frame
,我想计算一个性能指标(例如分位数)。但是,data.frame
的某些列包含您认为“负”的统计信息-例如:
r=seq(0,1,0.25)
apply(state.x77,2,function(x) quantile(x,probs = r))
Population Income Illiteracy Life Exp Murder HS Grad Frost Area
0% 365.0 3098.00 0.500 67.9600 1.400 37.80 0.00 1049.00
25% 1079.5 3992.75 0.625 70.1175 4.350 48.05 66.25 36985.25
50% 2838.5 4519.00 0.950 70.6750 6.850 53.25 114.50 54277.00
75% 4968.5 4813.50 1.575 71.8925 10.675 59.15 139.75 81162.50
100% 21198.0 6315.00 2.800 73.6000 15.100 67.30 188.00 566432.00
收入和预期寿命是积极的。但是,例如谋杀率是负数,越低越好。我完全想要这个结果:
Population Income Illiteracy Life Exp Murder HS Grad Frost Area
0% 365.0 3098.00 2.800 67.9600 15.100 37.80 188.00 1049.00
25% 1079.5 3992.75 1.575 70.1175 10.675 48.05 139.75 36985.25
50% 2838.5 4519.00 0.950 70.6750 6.850 53.25 114.50 54277.00
75% 4968.5 4813.50 0.625 71.8925 4.350 59.15 66.25 81162.50
100% 21198.0 6315.00 0.500 73.6000 1.400 67.30 0.00 566432.00
我设法使用两个sweep
函数和一个apply函数。太丑了!有没有更优雅的方式?
数据集state.x77
内置在R中。
答案 0 :(得分:3)
您可以将每一列乘以向量my_weight
中的相应权重。然后取结果的绝对值。而且由于四分位数已经是quantile
的默认值,因此无需定义概率向量。
my_weight <- c(1, 1, -1, 1, -1, 1, -1, 1)
res <- sapply(seq_along(as.data.frame(state.x77)), function(i)
abs(quantile(state.x77[, i]* my_weight[i])))
colnames(res) <- colnames(state.x77)
res
# Population Income Illiteracy Life Exp Murder HS Grad Frost Area
#0% 365.0 3098.00 2.800 67.9600 15.100 37.80 188.00 1049.00
#25% 1079.5 3992.75 1.575 70.1175 10.675 48.05 139.75 36985.25
#50% 2838.5 4519.00 0.950 70.6750 6.850 53.25 114.50 54277.00
#75% 4968.5 4813.50 0.625 71.8925 4.350 59.15 66.25 81162.50
#100% 21198.0 6315.00 0.500 73.6000 1.400 67.30 0.00 566432.00
答案 1 :(得分:1)
为什么不反转“否定” /“不良”列的值(例如,谋杀列):
r=seq(0,1,0.25)
quantiles <- apply(state.x77,2,function(x) quantile(x,probs = r))
quantiles[, "Murder"] <- rev(quantiles[, "Murder"])
P.S。显然,这违反了我们更改数据的“一行一观察”的原则。但这似乎正是您想要的。