R根据没有ifelse的另一列中的值查找行值

R find row value based on value in another column without ifelse

我有一个 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(),但无法正常工作。

我们可以通过 match 将 'column_name' 与数据集的列名称 (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