嗨,我有一个带有不同数据列(例如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 日创建