R:基于另一个变量的因子水平的新变量值

时间:2019-06-20 17:37:56

标签: r

我正在尝试创建一个新变量(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

我找不到解决方法。

4 个答案:

答案 0 :(得分:3)

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可能会很痛苦。)

答案 1 :(得分:1)

我确定有人可以提出一些更好的建议,但是tokenize($yourstring, '/')[last()] 可以完成工作:

dplyr::case_when()

答案 2 :(得分:1)

使用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

答案 3 :(得分:1)

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

创建