投射多个 value.var 由 fun.aggregate 控制
Casting multiple value.var controled by fun.aggregate
我有以下数据集
client_id <- c("A", "A", "B", "B", "B", "B", "B", "A", "A", "B", "B")
value <- c(10, 35, 20, 30, 50, 40, 30, 40, 30, 40, 10)
period_30 <- c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0)
period_60 <- c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0)
sign <- c("D", "D", "D", "D", "C", "C", "C", "D", "D", "D", "D")
data <- data.frame(client_id, value, period_30, period_60, sign)
我可以使用此代码通过以下代码计算每个给定期间的不同拆分次数:
library(data.table)
test<- dcast(setDT(data), client_id ~ paste0("period_30", sign), value.var = "period_30", sum)
但我还想根据不同的拆分来计算值。
预期结果 将如下所示:
client_id av.value_period_30_sign_D av.value_period_60_sign_D av.value_period_30_sign_C av.value_period_30_sign_D
A 34.16667 NaN NaN NaN
B 30.00000 34.16667 NaN 27.50000
然后,它应该可以扩展到其他拆分,例如周期 1 中类型 X 的符号 X 的平均值。
我不确定使用这种方法是否可以获得所需的输出。但我正在查看 fun.aggregate
参数。也许它可以与 多个 value.var
参数 结合使用?
更新:Joel 的代码回答了问题的第一部分。
client_id sign period_30 period_60
A D 34.16667 34.16667
B D 30.00000 34.16667
B C NaN 27.50000
但是我如何转置变量并根据拆分自动分配名称?
可以使用dplyr
;给定当前 df (=test):
df %>% group_by(sign) %>% summarize(avg.val=mean(value),avg.period1=mean(period_1),avg.period2=mean(period_2),avg.period3=mean(period_3))
给出:
# A tibble: 2 × 5
sign avg.val avg.period1 avg.period2 avg.period3
<chr> <dbl> <dbl> <dbl> <dbl>
1 Credit 39.50 0.50 1.0 1
2 Debit 36.25 0.25 0.5 1
您可以更改 group
中的分组变量以满足您的需要。
另一种方法(会更快)是使用 data.table
基于对问题所做的编辑:(希望代码现在是自我解释的)
library(data.table)
data1 <- setDT(data)[, lapply(.SD, function(x) mean(value[x==1])),
.SDcols = period_30:period_60,
by = .(client_id, sign)]
# `dcast` if also from `data.table` package
dcast(data1, client_id~sign, drop = FALSE, value.var = c("period_30", "period_60"))
# client_id period_30_C period_30_D period_60_C period_60_D
#1: A NA 34.16667 NA 34.16667
#2: B NaN 30.00000 27.5 34.16667
我有以下数据集
client_id <- c("A", "A", "B", "B", "B", "B", "B", "A", "A", "B", "B")
value <- c(10, 35, 20, 30, 50, 40, 30, 40, 30, 40, 10)
period_30 <- c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0)
period_60 <- c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0)
sign <- c("D", "D", "D", "D", "C", "C", "C", "D", "D", "D", "D")
data <- data.frame(client_id, value, period_30, period_60, sign)
我可以使用此代码通过以下代码计算每个给定期间的不同拆分次数:
library(data.table)
test<- dcast(setDT(data), client_id ~ paste0("period_30", sign), value.var = "period_30", sum)
但我还想根据不同的拆分来计算值。
预期结果 将如下所示:
client_id av.value_period_30_sign_D av.value_period_60_sign_D av.value_period_30_sign_C av.value_period_30_sign_D
A 34.16667 NaN NaN NaN
B 30.00000 34.16667 NaN 27.50000
然后,它应该可以扩展到其他拆分,例如周期 1 中类型 X 的符号 X 的平均值。
我不确定使用这种方法是否可以获得所需的输出。但我正在查看 fun.aggregate
参数。也许它可以与 多个 value.var
参数 结合使用?
更新:Joel 的代码回答了问题的第一部分。
client_id sign period_30 period_60
A D 34.16667 34.16667
B D 30.00000 34.16667
B C NaN 27.50000
但是我如何转置变量并根据拆分自动分配名称?
可以使用dplyr
;给定当前 df (=test):
df %>% group_by(sign) %>% summarize(avg.val=mean(value),avg.period1=mean(period_1),avg.period2=mean(period_2),avg.period3=mean(period_3))
给出:
# A tibble: 2 × 5
sign avg.val avg.period1 avg.period2 avg.period3
<chr> <dbl> <dbl> <dbl> <dbl>
1 Credit 39.50 0.50 1.0 1
2 Debit 36.25 0.25 0.5 1
您可以更改 group
中的分组变量以满足您的需要。
另一种方法(会更快)是使用 data.table
基于对问题所做的编辑:(希望代码现在是自我解释的)
library(data.table)
data1 <- setDT(data)[, lapply(.SD, function(x) mean(value[x==1])),
.SDcols = period_30:period_60,
by = .(client_id, sign)]
# `dcast` if also from `data.table` package
dcast(data1, client_id~sign, drop = FALSE, value.var = c("period_30", "period_60"))
# client_id period_30_C period_30_D period_60_C period_60_D
#1: A NA 34.16667 NA 34.16667
#2: B NaN 30.00000 27.5 34.16667