我有一个数据框,如下所示:
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 = '_'))
答案 0 :(得分:4)
dataDF %>%
gather(var, value , 3:5) %>%
mutate(var = gsub('_value', '', var)) %>%
filter(to_choose == var)
答案 1 :(得分:2)
使用mapply
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
来查找需要从中提取值的列索引。