2016-10-04 1 views
1

У меня есть data.frame построен следующим образом:R значение находки строки на основе значения в другом столбце без IfElse

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")))) 

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

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

ответ

2

Мы можем создать индекс столбца по match ТРАЕКТОРИЯМ «column_name» с именами столбцов набора данных (match(df$column_name, colnames(df))), cbind его с индексом строки (1:nrow(df)), извлеките элементы «ДФА» на основе этого и назначить (<-), чтобы создать столбец «значение».

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

Благодарим за быстрое и ясное объяснение! – Jesse