颠倒某些数据框列的顺序

时间:2019-01-26 12:38:58

标签: r dataframe apply

我有一个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中。

2 个答案:

答案 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。显然,这违反了我们更改数据的“一行一观察”的原则。但这似乎正是您想要的。