代码之家  ›  专栏  ›  技术社区  ›  user1165199

基于另一列中的值从数据帧中的列中选择

  •  0
  • user1165199  · 技术社区  · 7 年前

    我有一个数据帧,如下所示:

    dataDF <- data.frame(
              id = 1:5,
              to_choose = c('red', 'blue', 'red', 'green', 'yellow'),
              red_value = c(1,2,3,4,5),
              blue_value = c(6,7,8,9,10),
             yellow_value = c(11,12,13,14,15)
    )
    
    id to_choose red_value blue_value yellow_value
     1       red         1          6           11
     2      blue         2          7           12
     3       red         3          8           13
     4     green         4          9           14
     5    yellow         5         10           15
    

    value ,它是基于to\u choose列的相应列中的值。

    ifelse 如下

    mutate(dataDF,
       value = ifelse(to_choose == 'red', red_value,
                      ifelse(to_choose == 'blue', blue_value,
                             ifelse(to_choose == 'yellow', yellow_value, NA))))
    

    id to_choose red_value blue_value yellow_value value
     1       red         1          6           11     1
     2      blue         2          7           12     7
     3       red         3          8           13     3
     4     green         4          9           14    NA
     5    yellow         5         10           15    15
    

    但是如果有一种更简单的方法

    mutate(dataDF, value = paste(to_choose, 'value', sep = '_'))
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   kath    7 年前
    dataDF %>% 
      gather(var, value , 3:5) %>%   
      mutate(var = gsub('_value', '', var))  %>% 
      filter(to_choose == var)
    
        2
  •  2
  •   Ronak Shah    7 年前

    一种使用 mapply

    dataDF$value <- mapply(function(x, y) if(length(y) > 0)  dataDF[x, y] else NA, 
          1:nrow(dataDF), sapply(dataDF$to_choose, function(x) grep(x, names(dataDF))))
    
    
    dataDF
    
    #  id to_choose red_value blue_value yellow_value value
    #1  1       red         1          6           11     1
    #2  2      blue         2          7           12     7
    #3  3       red         3          8           13     3
    #4  4     green         4          9           14    NA
    #5  5    yellow         5         10           15    15
    

    其思想是获得适当的行和列索引以作为子集。行索引我们已经知道我们需要为数据帧的每一行获取值。就获得适当的列而言,我们使用 grep 结束 to_choose

    推荐文章