r - R:在循环条件下引用不同列表元素中的var
问题描述
我有一个包含许多变量的数据集(t01
-t05
在一个虚拟示例中,但在真实数据集中更多)。我将pred
变量计算为target == 1/n()
每个组级组合(中的第 5 个元素ns_by_group_list
)的比例。但是,如果该组合(var)中的总人数s
少于 6,我需要使用pred
等效组合中的值t01
(t04
第 4 个元素ns_by_group_list
)。如果这个小于 6,则来自t01
-t03
组合(的第 3 个元素ns_by_group_list
)等。最终输出应该看起来像ns_by_group_list[[5]]
,但 pred 值来自不同的ns_by_group_list list
元素。
我正在考虑将不同列表元素中的重命名pred
和s
vars 重命名为pred1
, pred2
, ..pred5
然后将它们全部放在一个 data.frame 中,然后创建一个长case_when
语句......但是肯定有更好/更优雅的方法来做到这一点?
library(tibble)
library(dplyr)
library(purrr)
library(stringr)
library(tidyr)
## functions ####
create_t_labels <- function(n) {
paste0('t', str_pad(1:n, 2, 'left', '0'))
}
ns_by_group <- function(group_vars) {
input %>%
group_by_at(.vars = vars(group_vars)) %>%
summarise(n = n()) %>% # total number of people in each group
ungroup() %>%
spread(key = target, value = n) %>%
mutate(`0` = replace_na(`0`, 0),
n = replace_na(`1`, 0),
s = n + `0`,
pred = round(n/s, 3)
) %>%
select(-c(`1`, `0`))
}
### input data ####
set.seed(1)
input <- tibble(
target = sample(0:1, 50, replace = TRUE),
t01 = sample(1:3, 50, replace = TRUE),
t02 = rep(1:2, each = 25),
t03 = rep(1:5, each = 10),
t04 = rep(1, 50),
t05 = rep(1:2, each = 25)
)
## calculations ####
group_combo_list <- map(1:5, create_t_labels)
group_combo_list <- map(group_combo_list, function(x) c(x, 'target'))
ns_by_group_list <- map(group_combo_list, ns_by_group)
解决方案
递归加入和替换:
reduce(
ns_by_group_list,
~ {
left_join(.y, .x, by = grep("^t\\d+$", names(.x), value = TRUE),
suffix = c("", ".replacement")) %>%
mutate(pred = if_else(s < 6, pred.replacement, pred),
s = if_else(s < 6, s.replacement, s)) %>%
select(-ends_with(".replacement"))
},
.dir = "backward"
)
# # A tibble: 16 x 8
# t01 t02 t03 t04 t05 n s pred
# <int> <int> <int> <dbl> <int> <dbl> <dbl> <dbl>
# 1 1 1 1 1 1 1 16 0.562
# 2 1 1 2 1 1 1 16 0.562
# 3 1 2 3 1 2 2 12 0.583
# 4 1 2 4 1 2 4 6 0.667
# 5 1 2 5 1 2 1 12 0.583
# 6 2 1 1 1 1 3 13 0.385
# 7 2 1 2 1 1 2 6 0.333
# 8 2 1 3 1 1 0 13 0.385
# 9 2 2 4 1 2 1 6 0.5
# 10 2 2 5 1 2 2 6 0.5
# 11 3 1 1 1 1 0 8 0.125
# 12 3 1 2 1 1 1 8 0.125
# 13 3 1 3 1 1 0 8 0.125
# 14 3 2 3 1 2 0 7 0.714
# 15 3 2 4 1 2 1 7 0.714
# 16 3 2 5 1 2 4 7 0.714
推荐阅读
- postgresql - Laravel whereIn array 参数号无效:参数未定义
- python - 如何更改 VisualStudio 的运行快捷方式运行命令(python)
- laravel - 如何在 swagger php 中的 application/json 中发送 multipart/form-data 文件
- java - Java中的JSON到对象转换
- bash - 使用 i3blocks 在后台启动程序后,Bash 脚本暂停
- c++ - 在 VC++ 通知回调中 NMHDR* 可以为 NULL 吗?
- javascript - 如何在 bitbucket pipelines.yml 文件中编写条件语句?
- python - 将 AdditiveGaussianNoise 包含到自定义的 ImageDataGenerator(sequence)
- javascript - Javascript 循环只运行一次
- magento2 - Magento 2:是否可以将扩展名从 html 切换到 phtml