在 R 中计算响应率
Calculating Response Rates in R
我在R中有一个数据table,例如:
id 列是唯一的 customerid。我想做的是通过细分因素计算响应率列。
我如何执行 count(unique paymentid)/count(unique id)
排除 paymentid 中的 NA 之类的功能?
我希望我的结果 table 看起来像:
非常感谢!
有几种方法可以做到这一点。这是一种使用 by
的方法,一种使用 dplyr
:
d <- data.frame(segment=c('Y', 'Y', 'R', 'R', 'B', 'B', 'B'),
paymentamount=c(10, NA, 20, 15, 12, 13, NA))
由
do.call(rbind,
by(d$paymentamount, d$segment, function(x) {
sent <- length(x)
responded <- sum(!is.na(x))
cbind.data.frame(sent, responded, rate=round(responded/sent*100))
}))
# sent responded rate
# B 3 2 67
# R 2 2 100
# Y 2 1 50
dplyr
library(dplyr)
d %>% group_by(segment) %>%
summarise(sent=length(paymentamount),
responded=sum(!is.na(paymentamount)),
rate=round(responded/sent*100, 2))
# Source: local data frame [3 x 4]
#
# segment sent responded rate
# 1 B 3 2 66.67
# 2 R 2 2 100.00
# 3 Y 2 1 50.00
可能有更优雅的方法来做到这一点,但这里有一个选项(稍微过时的版本)data.table
:
library(data.table)
library(scales)
##
setDT(Df)
##
Df2 <- Df[
,list(
NumberSent=.N,
NumberResponded=length(
unique(na.omit(paymentid)))),
by=segment][,ResponseRate:=percent(
NumberResponded/NumberSent)]
##
R> Df2
segment NumberSent NumberResponded ResponseRate
1: Y 2 1 50.0%
2: R 2 2 100.0%
3: B 3 2 66.7%
包 scales
仅用于函数 percent
。
数据:
Df <- data.frame(
id=1:7,
segment=rep(c("Y","R","B"),c(2,2,3)),
paymentamount=c(10,NA,20,15,12,13,NA),
paymentid=c(11,NA,12,13,14,15,NA))
这里我用的是dplyr
d <- data.frame(segment=c('Y', 'Y', 'R', 'R', 'B', 'B', 'B'), paymentamount=c(10, NA, 20, 15, 12, 13, NA))
require(dplyr)
x <- d %>%
group_by(segment) %>%
summarize(NumberSent = n(), NumberResponded = sum(!is.na(paymentamount)),
ResponseRate = paste(round(100*(NumberResponded/NumberSent),0),"%", sep="") ) %>%
arrange(desc(segment))
我在R中有一个数据table,例如:
id 列是唯一的 customerid。我想做的是通过细分因素计算响应率列。
我如何执行 count(unique paymentid)/count(unique id)
排除 paymentid 中的 NA 之类的功能?
我希望我的结果 table 看起来像:
非常感谢!
有几种方法可以做到这一点。这是一种使用 by
的方法,一种使用 dplyr
:
d <- data.frame(segment=c('Y', 'Y', 'R', 'R', 'B', 'B', 'B'),
paymentamount=c(10, NA, 20, 15, 12, 13, NA))
由
do.call(rbind,
by(d$paymentamount, d$segment, function(x) {
sent <- length(x)
responded <- sum(!is.na(x))
cbind.data.frame(sent, responded, rate=round(responded/sent*100))
}))
# sent responded rate
# B 3 2 67
# R 2 2 100
# Y 2 1 50
dplyr
library(dplyr)
d %>% group_by(segment) %>%
summarise(sent=length(paymentamount),
responded=sum(!is.na(paymentamount)),
rate=round(responded/sent*100, 2))
# Source: local data frame [3 x 4]
#
# segment sent responded rate
# 1 B 3 2 66.67
# 2 R 2 2 100.00
# 3 Y 2 1 50.00
可能有更优雅的方法来做到这一点,但这里有一个选项(稍微过时的版本)data.table
:
library(data.table)
library(scales)
##
setDT(Df)
##
Df2 <- Df[
,list(
NumberSent=.N,
NumberResponded=length(
unique(na.omit(paymentid)))),
by=segment][,ResponseRate:=percent(
NumberResponded/NumberSent)]
##
R> Df2
segment NumberSent NumberResponded ResponseRate
1: Y 2 1 50.0%
2: R 2 2 100.0%
3: B 3 2 66.7%
包 scales
仅用于函数 percent
。
数据:
Df <- data.frame(
id=1:7,
segment=rep(c("Y","R","B"),c(2,2,3)),
paymentamount=c(10,NA,20,15,12,13,NA),
paymentid=c(11,NA,12,13,14,15,NA))
这里我用的是dplyr
d <- data.frame(segment=c('Y', 'Y', 'R', 'R', 'B', 'B', 'B'), paymentamount=c(10, NA, 20, 15, 12, 13, NA))
require(dplyr)
x <- d %>%
group_by(segment) %>%
summarize(NumberSent = n(), NumberResponded = sum(!is.na(paymentamount)),
ResponseRate = paste(round(100*(NumberResponded/NumberSent),0),"%", sep="") ) %>%
arrange(desc(segment))