Обратный порядок некоторых столбцов фрейма данных - PullRequest
0 голосов
/ 26 января 2019

У меня есть 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 голосов
/ 26 января 2019

Вы можете умножить каждый столбец на соответствующий вес в векторе 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
0 голосов
/ 26 января 2019

Почему бы не изменить значения ваших «отрицательных» / «плохих» столбцов (например, для столбца убийств):

r=seq(0,1,0.25)
quantiles <- apply(state.x77,2,function(x) quantile(x,probs = r))
quantiles[, "Murder"] <- rev(quantiles[, "Murder"])

P.S. Очевидно, что это нарушает принцип наблюдения один ряд, когда мы изменяем данные ... Но, похоже, это то, что вы хотите.

...