我正在尝试创建一个新变量(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
我找不到解决方法。
答案 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
创建