首页 > 解决方案 > R:在循环条件下引用不同列表元素中的var

问题描述

我有一个包含许多变量的数据集(t01-t05在一个虚拟示例中,但在真实数据集中更多)。我将pred变量计算为target == 1/n()每个组级组合(中的第 5 个元素ns_by_group_list)的比例。但是,如果该组合(var)中的总人数s少于 6,我需要使用pred等效组合中的值t01t04第 4 个元素ns_by_group_list)。如果这个小于 6,则来自t01-t03组合(的第 3 个元素ns_by_group_list)等。最终输出应该看起来像ns_by_group_list[[5]],但 pred 值来自不同的ns_by_group_list list元素。

我正在考虑将不同列表元素中的重命名predsvars 重命名为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)

标签: rlistif-statementconditional-statementspurrr

解决方案


递归加入和替换:

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

推荐阅读