Доступ к элементу списка в R по значению отдельной переменной - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть фрейм данных с двумя интересующими переменными: символьная переменная, которая является аббревиатурой состояния для каждого объекта, и код региона для каждого объекта.У меня также есть список, который связывает набор допустимых кодов регионов с каждым состоянием.

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 не получается рекурсивная индексация* работает сам по себе.

Как вытащить нужный элемент списка на основе значения переменной "состояние"?Попытка избежать петель конечно.

1 Ответ

0 голосов
/ 09 декабря 2018

Мы можем циклически пройтись по «состоянию» и соответствующим значениям «региона» с помощью map2 (из purrr), извлечь элемент list из «accept_region» из значения «состояния», проверить,%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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...