总结布尔变量的矩阵

时间:2018-05-28 14:20:41

标签: r

我有一堆布尔变量。我想总结一下,并显示正值的百分比。这个问题中的大事是变量在两个维度上是逻辑组织的。

我想要的结果应该是这样的(种类):

      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 :(得分:1)

您可以将指标名称拆分为单独的列。

使用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)

...给予

   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

答案 1 :(得分:1)

如果您不介意添加行名和列名,可以使用colMeansmatrix构造函数来构建具有所需结构的矩阵。

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])

会做到这一点。