Выбрать из столбца в кадре данных на основе значения в другом столбце - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий фрейм данных:

dataDF <- data.frame(
          id = 1:5,
          to_choose = c('red', 'blue', 'red', 'green', 'yellow'),
          red_value = c(1,2,3,4,5),
          blue_value = c(6,7,8,9,10),
         yellow_value = c(11,12,13,14,15)
)

id to_choose red_value blue_value yellow_value
 1       red         1          6           11
 2      blue         2          7           12
 3       red         3          8           13
 4     green         4          9           14
 5    yellow         5         10           15

Я хочу создать новый столбец value, который является значением из соответствующего столбца на основе столбца to_choose.

Я мог бы сделать это с ifelse следующим образом

mutate(dataDF,
   value = ifelse(to_choose == 'red', red_value,
                  ifelse(to_choose == 'blue', blue_value,
                         ifelse(to_choose == 'yellow', yellow_value, NA))))

Чтобы дать

id to_choose red_value blue_value yellow_value value
 1       red         1          6           11     1
 2      blue         2          7           12     7
 3       red         3          8           13     3
 4     green         4          9           14    NA
 5    yellow         5         10           15    15

Но если бы существовал более простой способ сделать это в одну строчку по

mutate(dataDF, value = paste(to_choose, 'value', sep = '_'))

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Базовый подход R с использованием mapply

dataDF$value <- mapply(function(x, y) if(length(y) > 0)  dataDF[x, y] else NA, 
      1:nrow(dataDF), sapply(dataDF$to_choose, function(x) grep(x, names(dataDF))))


dataDF

#  id to_choose red_value blue_value yellow_value value
#1  1       red         1          6           11     1
#2  2      blue         2          7           12     7
#3  3       red         3          8           13     3
#4  4     green         4          9           14    NA
#5  5    yellow         5         10           15    15

Идея состоит в том, чтобы получить соответствующие индексы строк и столбцов для поднабора.Индексы строк: мы уже знаем, что нам нужно получить значение для каждой строки кадра данных.Что касается получения соответствующего столбца, мы используем grep сверх to_choose, чтобы найти индекс столбца, из которого нужно извлечь значение.

0 голосов
/ 11 октября 2018
dataDF %>% 
  gather(var, value , 3:5) %>%   
  mutate(var = gsub('_value', '', var))  %>% 
  filter(to_choose == var)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...