根据另一列中的值从数据框中的列中选择

时间:2018-10-11 13:49:15

标签: r dplyr mutate

我有一个数据框,如下所示:

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 :(得分:4)

dataDF %>% 
  gather(var, value , 3:5) %>%   
  mutate(var = gsub('_value', '', var))  %>% 
  filter(to_choose == var)

答案 1 :(得分:2)

使用mapply

的基本R方法
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来查找需要从中提取值的列索引。