首页 文章

通过单独变量的值访问R中的列表元素

提问于
浏览
1

我有一个数据框,其中包含两个感兴趣的变量:一个字符变量,它是每个obs的状态缩写,以及每个obs的区域代码 . 我还有一个列表,它将一组可接受的区域代码与每个州相关联 .

df <- data.frame(state=c("AL","CO","DE","TX"), region=c(1,2,3,4))
acceptable_regions <- list(AL=c(1,2), CO=1, DE=c(2,3), TX=(1:4))

我想创建一个虚拟变量,如果该区域包含在可接受代码集中,则分配“0”,否则为“1” . 我的第一个想法是使用ifelse()但我得到一个错误,递归索引在2级失败 .

df$far_away <- ifelse(df$region %in% acceptable_regions[[df$state]], 0,1)

我原以为ifelse会认识到我想通过df $状态进行索引,因为 acceptable_regions[[df$state[i]] 可以独立工作 .

如何根据变量“state”的值拉出我想要的列表元素?当然要尽量避免循环 .

1 回答

  • 1

    我们可以使用 map2 (来自 purrr )循环'state'和'region'的相应值,从'state'的值中提取'acceptable_region'的 list 元素,检查是否 %in% 'region'得到逻辑 vector ,用 as.integer 将其强制转换为二进制

    library(tidyverse)
    df %>% 
       mutate(far_away = map2_int(state, region, ~
                  as.integer(.y %in% acceptable_regions[[.x]])))
    #  state region far_away
    #1    AL      1        1
    #2    CO      2        0
    #3    DE      3        1
    #4    TX      4        1
    

    或者使用 rowwise

    df %>%
      rowwise %>% 
         mutate(far_away = as.integer(region %in% acceptable_regions[[state]]))
    #Source: local data frame [4 x 3]
    #Groups: <by row>
    
    # A tibble: 4 x 3
    #  state region far_away
    #  <fct>  <dbl>    <int>
    #1 AL         1        1
    #2 CO         2        0
    #3 DE         3        1
    #4 TX         4        1
    

    或者使用 base R ,使用 Map

    df$far_away <- as.integer(unlist(Map(function(x, y) 
            y %in% acceptable_regions[[x]], df$state, df$region)))
    

相关问题