在列 R 中逐组计算百分比
calculating percentage group by group in a column R
再次强调,我是 R 的新手,正在尝试解决我遇到的问题。
我有一个数据集 "ds",列 "group" 和 "match"
我需要计算每组列匹配组的百分比
第一组是 001 第二组是 002,第三组是 003,等等。
我现在有一个数据:
>ds
group col1 col2 match
001 F M FALSE
001 F M FALSE
001 F M FALSE
002 F M FALSE
002 M M TRUE
003 M F FALSE
003 F F TRUE
003 F F TRUE
003 F M FALSE
004 F M FALSE
005 F F TRUE
005 M F FALSE
005 M M TRUE
006 M M TRUE
006 F M FALSE
006 F M FALSE
006 F M FALSE
006 F M FALSE
006 F F TRUE
006 F M FALSE
006 F M FALSE
Desired result:
group | col1 | col2 | match | mismatch % | Match %
001 F M FALSE 1.0 0
001 F M FALSE
001 F M FALSE
002 F M FALSE 0.50 0.50
002 M M TRUE
003 M F FALSE 0.50 0.50
003 F F TRUE
003 F F TRUE
003 F M FALSE
004 F M FALSE 1.0 0
005 F F TRUE 0.66 0.33
005 M F FALSE
005 M M TRUE
006 M M TRUE
006 F M FALSE 0.75 0.25
006 F M FALSE
006 F M FALSE
006 F M FALSE
006 F F TRUE
006 F M FALSE
006 F M FALSE
我知道如何计算整列:
percentage <- table(ds$match)
cbind(percentage,prop.table(percentage))
但我上面显示的解决方案不能采用它
谢谢
这是 dplyr
的一种方法
我们可以在这里利用两件事:你有一个充满 true/false 值的列,而且你的不匹配量只是 1 减去匹配的比例。
library(dplyr)
# test data
data <- data.frame(group = factor(c(1,1,1,2,2)), col1 = c(1,1,1,1,0), col2 = c(0,0,0,0,0),
match = c(F,F,F,F,T))
# group by group, then sum the T/F vector and divide by the number of data
# points per group
desired <- data %>% group_by(group) %>% summarise(Match_per = sum(match)/length(match))
# the mismatch is 1 minus the match
desired$Mismatch <- 1 - desired$Match
data$Match_percent <- NA
data$Mismatch_percent <- NA
data[which(duplicated(data$group) == FALSE),
which(colnames(data) %in%c("Match_percent",
"Mismatch_percent"))] <- desired[,=1]
输出
group col1 col2 match Match_percent Mismatch_percent
1 1 1 0 FALSE 0.0 1.0
2 1 1 0 FALSE NA NA
3 1 1 0 FALSE NA NA
4 2 1 0 FALSE 0.5 0.5
5 2 0 0 TRUE NA NA
再次强调,我是 R 的新手,正在尝试解决我遇到的问题。 我有一个数据集 "ds",列 "group" 和 "match" 我需要计算每组列匹配组的百分比 第一组是 001 第二组是 002,第三组是 003,等等。
我现在有一个数据:
>ds
group col1 col2 match
001 F M FALSE
001 F M FALSE
001 F M FALSE
002 F M FALSE
002 M M TRUE
003 M F FALSE
003 F F TRUE
003 F F TRUE
003 F M FALSE
004 F M FALSE
005 F F TRUE
005 M F FALSE
005 M M TRUE
006 M M TRUE
006 F M FALSE
006 F M FALSE
006 F M FALSE
006 F M FALSE
006 F F TRUE
006 F M FALSE
006 F M FALSE
Desired result:
group | col1 | col2 | match | mismatch % | Match %
001 F M FALSE 1.0 0
001 F M FALSE
001 F M FALSE
002 F M FALSE 0.50 0.50
002 M M TRUE
003 M F FALSE 0.50 0.50
003 F F TRUE
003 F F TRUE
003 F M FALSE
004 F M FALSE 1.0 0
005 F F TRUE 0.66 0.33
005 M F FALSE
005 M M TRUE
006 M M TRUE
006 F M FALSE 0.75 0.25
006 F M FALSE
006 F M FALSE
006 F M FALSE
006 F F TRUE
006 F M FALSE
006 F M FALSE
我知道如何计算整列:
percentage <- table(ds$match)
cbind(percentage,prop.table(percentage))
但我上面显示的解决方案不能采用它
谢谢
这是 dplyr
我们可以在这里利用两件事:你有一个充满 true/false 值的列,而且你的不匹配量只是 1 减去匹配的比例。
library(dplyr)
# test data
data <- data.frame(group = factor(c(1,1,1,2,2)), col1 = c(1,1,1,1,0), col2 = c(0,0,0,0,0),
match = c(F,F,F,F,T))
# group by group, then sum the T/F vector and divide by the number of data
# points per group
desired <- data %>% group_by(group) %>% summarise(Match_per = sum(match)/length(match))
# the mismatch is 1 minus the match
desired$Mismatch <- 1 - desired$Match
data$Match_percent <- NA
data$Mismatch_percent <- NA
data[which(duplicated(data$group) == FALSE),
which(colnames(data) %in%c("Match_percent",
"Mismatch_percent"))] <- desired[,=1]
输出
group col1 col2 match Match_percent Mismatch_percent
1 1 1 0 FALSE 0.0 1.0
2 1 1 0 FALSE NA NA
3 1 1 0 FALSE NA NA
4 2 1 0 FALSE 0.5 0.5
5 2 0 0 TRUE NA NA