R dplyr从具有列名的列中选择值以在单独的列中进行选择

Sar*_*rah 5 r dplyr

嗨,我有一个带有不同数据列(例如x,y,z)的数据框,以及另一列指定要选择的数据框。我想使用dplyr :: mutate(或类似方法)来制作一个新列,该列的值对应于“选择”指定的列中的值。但是我想将所有列都放在首位。在我的真实数据中,我还有其他一些带有元数据的列。

示例数据:

library(dplyr)
testdf <- data.frame(x = 1:5, y = 11:15, z = 101:105, choose = c("z","y","x","y","z"))
Run Code Online (Sandbox Code Playgroud)

我可以在示例中使用来完成这项工作,case_when但是在我的实际脚本中会生成列名和select列,并且它们可能具有不同的值,所以我不想硬编码可能存在的名称。

所需的输出/测试

mutate(testdf, selectedValue = case_when(choose == "x" ~x,
                                     choose == "y"~ y,
                                     choose == "z"~ z, T~NA_integer_))

#>   x  y   z choose selectedValue
#> 1 1 11 101      z           101
#> 2 2 12 102      y            12
#> 3 3 13 103      x             3
#> 4 4 14 104      y            14
#> 5 5 15 105      z           105
Run Code Online (Sandbox Code Playgroud)

reprex软件包(v0.3.0)创建于2019-09-18

小智 5

这是一个 data.table 解决方案。在这种情况下,我不认为 dplyr 解决方案比其他解决方案(特别是 base r 和 data.table)更具可读性。

library(data.table)
testdt <- data.table(x = 1:5, y = 11:15, z = 101:105, choose = c("z","y","x","y","z"))
testdt[,selectedValue := get(choose), by = choose]
testdt
#>    x  y   z choose selectedValue
#> 1: 1 11 101      z           101
#> 2: 2 12 102      y            12
#> 3: 3 13 103      x             3
#> 4: 4 14 104      y            14
#> 5: 5 15 105      z           105
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2019 年 9 月 17 日创建

  • 谢谢。通常我真的很难理解 data.table 发生了什么,但我同意这里它实际上是相当可读的 (2认同)