我有一堆布尔变量。我想总结一下,并显示正值的百分比。这个问题中的大事是变量在两个维度上是逻辑组织的。
我想要的结果应该是这样的(种类):
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矩阵组织。
答案 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)
如果您不介意添加行名和列名,可以使用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])
会做到这一点。