How can I use one column's value (eg, x
below) to select among values among possible columns, when the selection is specific to each row?
x
变量确定是否应为给定行选择变量a
、b
或。c
这是一个简化的示例;真正的单元格不是列名和行号的串联。
library(magrittr); requireNamespace("tibble"); requireNamespace("dplyr")
ds <- tibble::tibble(
x = c( 1 , 1 , 2 , 3 , 1 ),
a = c("a1", "a2", "a3", "a4", "a5"),
b = c("b1", "b2", "b3", "b4", "b5"),
c = c("c1", "c2", "c3", "c4", "c5")
)
所需的列是值:
# ds$y_desired <- c("a1", "a2", "b3", "c4", "a5")
# ds$column_desired <- c("a" , "a" , "b" , "c" , "a" )
当然,以下不会产生一列,而是五列。
ds[, ds$column_desired]
以下产生错误:
Error in mutate_impl(.data, dots) : basic_string::_M_replace_aux
.
ds %>%
dplyr::rowwise() %>%
dplyr::mutate(
y = .[[column_desired]]
) %>%
dplyr::ungroup()
如果我的真实场景只有两个或三个选择,我可能会使用嵌套如果,但我想要一种通用映射方法来适应更多的条件。
ds %>%
dplyr::mutate(
y_if_chain = ifelse(x==1, a, ifelse(x==2, b, c))
)
理想情况下,该方法可以通过查找表或其他一些元数据对象来指导,例如:
ds_lookup <- tibble::tribble(
~x, ~desired_column,
1L, "a",
2L, "b",
3L, "c"
)
我敢肯定之前有人问过这个列切换问题,但我没有找到适用的问题。
我更喜欢tidyverse解决方案(b/c 这是我的团队最喜欢的),但我对任何工具都持开放态度。我不知道如何结合使用apply和kimisc::vswitch。