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

时间:2019-09-18 01:41:47

标签: r dplyr

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

3 个答案:

答案 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)

如果将purrrdplyr一起使用:

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