【问题标题】:R: new variable values based on factor levels of another variableR:基于另一个变量的因子水平的新变量值
【发布时间】:2019-11-03 14:04:45
【问题描述】:

我正在尝试创建一个新变量 (var5),它根据因子变量 (var4) 的级别从数据框中的其他数值变量之一(var1、var2 或 var3)中获取值

variables=data.frame(var1=c(2,3,4,5), var2=c(20,30,40,50), var3=c(200,300,400,500), var4=c('var1','var2','var3','var1'))

变量

  var1 var2 var3 var4
1    2   20  200 var1
2    3   30  300 var2
3    4   40  400 var3
4    5   50  500 var1 

预期的结果是这样的:

  var1 var2 var3 var4 var5
1    2   20  200 var1    2
2    3   30  300 var2   30
3    4   40  400 var3  400
4    5   50  500 var1    5

我找不到解决办法。

【问题讨论】:

    标签: r


    【解决方案1】:
    for(i in 1:nrow(df)) {
      df$var5[i] <- df[which(colnames(df)==df$var4[i]), i]
    }
    

    与 sapply(谢谢你,安德鲁 :-))

    df$var5 <- unlist(sapply(seq_along(df), function(x) df[x, match(df$var4[x], names(df))]))
    

    这是动态的。 (如果您有 100 个不同的列,case_when 可能会很痛苦)。

    【讨论】:

    • 没问题!此外,它可能不需要unlist,但无论哪种方式都可以!
    • 是的,不需要,我有一个错误,因为我在已经更新的 data.frame 上使用了它,这导致了不同的列长度。 unlist 可能会让它更安全一点:-)
    【解决方案2】:

    我相信有人能想出更棒的东西,但dplyr::case_when() 会完成这项工作:

    library(dplyr)
    
    data.frame(
      var1 = c(2, 3, 4, 5),
      var2 = c(20, 30, 40, 50),
      var3 = c(200, 300, 400, 500),
      var4 = c('var1', 'var2', 'var3', 'var1')) %>%
      mutate(var5 = case_when(var4 == "var1" ~ var1,
                              var4 == "var2" ~ var2,
                              var4 == "var3" ~ var3))
    

    【讨论】:

      【解决方案3】:

      使用data.table:

      library(data.table)
      setDT(variables)[, var5 := ifelse(var4 == "var1", var1, ifelse(var4 == "var2", var2, var3))]
      
      
      
          var1 var2 var3 var4 var5
      1:    2   20  200 var1    2
      2:    3   30  300 var2   30
      3:    4   40  400 var3  400
      4:    5   50  500 var1    5
      

      【讨论】:

        【解决方案4】:
        variables=data.frame(var1=c(2,3,4,5), var2=c(20,30,40,50), 
                             var3=c(200,300,400,500), var4=c('var1','var2','var3','var1'))
        
        library(tidyverse)
        
        variables %>%
          mutate(var5 = pmap_chr(
            .l = .,
            .f = function(...){
              row <-  c(...)
              cols <- row["var4"] %>% `[[`(1)
              vals <- row[cols] %>% str_c()
              return(vals)
            }
          ))
        
        #>   var1 var2 var3 var4 var5
        #> 1    2   20  200 var1    2
        #> 2    3   30  300 var2   30
        #> 3    4   40  400 var3  400
        #> 4    5   50  500 var1    5
        

        由 reprex package (v0.3.0) 于 2019-06-20 创建,参考 mutate specific column by evaluating lookup cell value

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-08
          • 2015-01-05
          • 2017-05-23
          • 2015-10-04
          • 2014-04-30
          相关资源
          最近更新 更多