获取与列名对应的行值

时间:2017-05-03 14:26:20

标签: r dplyr

我有这个数据集

Use "safe writes"

我想在变量 Book2 <- structure(list(meanX3 = c(21.66666667, 21.66666667, 11, 25, 240.3333333 ), meanX1 = c(23, 34.5, 10, 25, 233.5), meanX2 = c(24.5, 26.5, 20, 25, 246.5), to_select = structure(c(3L, 1L, 2L, 1L, 1L), .Label = c("meanX1", "meanX2", "meanX3"), class = "factor"), selected = c(NA, NA, NA, NA, NA)), .Names = c("meanX3", "meanX1", "meanX2", "to_select", "selected"), class = "data.frame", row.names = c(NA, -5L)) 上获取列名的相应行值。

我试过了

to_select

但它返回所有列值。我怎样才能获得像

这样的数据集
Book2 %>%   dplyr::mutate(selected=.[paste0(to_select)])

3 个答案:

答案 0 :(得分:2)

一种方法是使用rowwise()逐行分组,然后使用get“to_select”列中字符串的值

Book2 %>% 
    rowwise() %>%
    mutate(selected = get(as.character(to_select)))
# A tibble: 5 × 5
#     meanX3 meanX1 meanX2 to_select  selected
#      <dbl>  <dbl>  <dbl>    <fctr>     <dbl>
#1  21.66667   23.0   24.5    meanX3  21.66667
#2  21.66667   34.5   26.5    meanX1  34.50000
#3  11.00000   10.0   20.0    meanX2  20.00000
#4  25.00000   25.0   25.0    meanX1  25.00000
#5 240.33333  233.5  246.5    meanX1 233.50000

答案 1 :(得分:2)

在基础R中,您可以使用match选择所需的列,然后使用矩阵子集来为每行选择特定元素,如下所示

Book2$selected <- as.numeric(Book2[cbind(seq_len(nrow(Book2)),
                                          match(Book2$to_select, names(Book2)))])

答案 2 :(得分:2)

使用基数R,安全策略就像

cols <- as.character(unique(Book2$to_select))
row_col <- match(Book2$to_select, cols)
idx <- cbind(seq_along(Book2$to_select), row_col)
selected <- Book2[, cols][idx]

Book2$selected <- selected

或使用tidyverse包,类似

library(tidyverse)
Book2 %>% mutate(row=1:n()) %>% 
    gather(prop, val, meanX3:meanX2) %>% 
    group_by(row) %>% 
    mutate(selected=val[to_select==prop]) %>%
    spread(prop, val) %>% select(-row)

将是一个不错的战略。