R найти значение строки на основе значения в другом столбце без ifelse

#r #apply

#r #применить

Вопрос:

Я data.frame построил следующим образом:

 a   b   c   d   column_name
1   2   3   4   a
2   3   4   1   b
3   4   1   2   c
4   1   2   3   d
  

Теперь я хочу получить значение для каждой строки столбца, которое соответствует имени в column_name . Я создаю это с ifelse помощью примерно так:

 df$value <- ifelse(df$column_name=="a", df$a, 
ifelse(df$column_name=="b", df$b, 
ifelse(df$column_name=="c", df$c, 
ifelse(df$column_name=="d", df$d, "NA"))))
  

Однако это не очень красиво и эффективно. С более чем 4 возможными столбцами становится невозможным использовать.

Кто-нибудь знает более эффективный и красивый способ? Я пытался apply() , но не смог заставить его работать.

Ответ №1:

Мы можем создать индекс столбца, введя match ‘column_name’ с именами столбцов dataset ( match(df$column_name, colnames(df)) ), cbind его с индексом строки ( 1:nrow(df) ), извлечь элементы ‘df’ на основе этого и присвоить ( <- ) его для создания столбца ‘value’.

 df$value <- df[-ncol(df)][cbind(1:nrow(df), match(df$column_name, colnames(df)))]
df$value
#[1] 1 3 1 3