Матрица суммирования булевых переменных - PullRequest
0 голосов
/ 28 мая 2018

У меня есть куча булевых переменных.Я хочу обобщить их и показать процент положительных значений. большая вещь в этом вопросе состоит в том, что переменные логически организованы в двух измерениях.

Результат, который я хочу, должен выглядеть следующим образом (вид):

      a    b
v1_1 30%  60%
v1_2 60%  50% 

Вот минимальный рабочий (самодельный) пример.

#!/usr/bin/env Rscript

set.seed(0)
df <- data.frame(v1_1_a = sample(c(T,F), 10, replace=TRUE),
                 v1_1_b = sample(c(T,F), 10, replace=TRUE),
                 v1_2_a = sample(c(T,F), 10, replace=TRUE),
                 v1_2_b = sample(c(T,F), 10, replace=TRUE))

my_percent <- function (col) { return (100 / length(col) * sum(col)) }

p <- apply(df, 2, my_percent)

print(p)

Это вывод :

v1_1_a v1_1_b v1_2_a v1_2_b 
    30     60     60     50 

Только для информации: реальные данные имеют 80Булевы переменные логические , организованные в матрице 10 x 8.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Если вы не против добавления имен строк и столбцов, вы можете использовать colMeans вместе с функцией построения matrix для построения матрицы с желаемой структурой.

myMat <- matrix(colMeans(df), 2, byrow = TRUE)
MyMat
     [,1] [,2]
[1,]  0.3  0.6
[2,]  0.6  0.5

При желании вы можете добавить имена, используя dimnames.В этом случае,

dimnames(myMat) <- list(paste0("V1", 1:2), letters[1:2])

добьется цели.

0 голосов
/ 28 мая 2018

Вы можете разбить имена метрик на отдельные столбцы.

С помощью dplyr и tidyr:

 p <- data.frame(p)

 p$metric <- row.names(p)

 p %>% mutate(metric_1 = ifelse(grepl('v1_1_', metric), "v1_1", "v1_2"),
         metric_2 = ifelse(grepl('a', metric), 'a', 'b')) %>%
   select(-metric) %>%
   spread(key = metric_2, value = p)

Giving ...

   metric_1  a  b
 1     v1_1 30 60
 2     v1_2 60 50

Вы можете установитьимена строк, чтобы получить именно то, что вы хотите:

 row.names(p) <- p$metric_1
 p %<>% select(-metric_1)

В результате ...

       a  b
 v1_1 30 60
 v1_2 60 50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...