#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