嗨,我有一个带有不同数据列(例如x,y,z)的数据框,另一列指定了要选择的列。我想使用dplyr :: mutate(或类似方法)来制作一个新列,该列的值对应于“选择”指定的列中的值。但我想将所有列都放在首位。在我的真实数据中,我还有其他一些带有元数据的列。
示例数据:
(x:xs)
我可以在示例中使用xs
来完成这项工作,但是在我的实际脚本中,会生成列名和select列,并且它们可能具有不同的值,所以我不想硬编码可能存在的名称。
所需的输出/测试
library(dplyr)
testdf <- data.frame(x = 1:5, y = 11:15, z = 101:105, choose = c("z","y","x","y","z"))
由reprex package(v0.3.0)于2019-09-18创建
答案 0 :(得分:4)
这是一个数据表解决方案。在这种情况下,我认为dplyr解决方案不比其他解决方案(特别是基于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
由reprex package(v0.3.0)于2019-09-17创建
答案 1 :(得分:2)
如果将purrr
与dplyr
一起使用:
testdf %>%
mutate(selectedValue = purrr::map2_dbl(row_number(),choose,~testdf[.x,.y]))
答案 2 :(得分:1)
一种基本的R方式是创建一个行/列索引矩阵作为testdf
的子集。我们使用match
获取列索引并为行创建一个顺序计数器。
testdf$selectedvalue <- testdf[cbind(seq_len(nrow(testdf)),
match(testdf$choose, names(testdf)))]
testdf
# 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