使用'复合'引用变量。名称

时间:2017-10-18 09:19:31

标签: r

我有一个数据框:

Idx Var X12 X34 
12 NA 444 100 
34 NA 500 777 
12 300 600 900 

我需要使用' Idx'引用的适当值替换Var中的NA。在' X'变量,所以如果Idx = 12那么我们需要' X12'的值。结果数据框将如下所示:

Idx Var X12 X34
12 444 444 100 
34 777 500 777 
12 300 600 900 


我尝试了结合“Idx'用' X'但R并不认识这是一个有效的变量。我尝试了什么:

df$Var <- ifelse(is.na(df$Var), 
   df[[paste0("X", df$Idx)]],
   df$Var

但这给了我一个错误:

Error in .subset2(x, i, exact = exact) : 
recursive indexing failed at level 2

3 个答案:

答案 0 :(得分:1)

我遍历每一行并询问Var是否为NA的解决方案。如果Var为NA,则会提取相应的Idx列,否则返回Var

d$Var <- apply(d, 1, function(x) ifelse(is.na(x[2]),
                                        x[paste0("X", x[1])],
                                        x[2]))

答案 1 :(得分:1)

您可以将datatableeval用于此

d <- data.table(read.table(text = "Idx Var X12 X34 
12 NA 444 100 
34 NA 500 777 
12 300 600 900", header = T))

d[is.na(Var), Var:= eval(parse(text = paste("X", Idx, sep = ""))), by = Idx]
d

    Idx Var X12 X34
1:  12 444 444 100
2:  34 777 500 777
3:  12 300 600 900

答案 2 :(得分:0)

我们可以使用行/列索引。获取'Var'列('i1')的NA元素的索引,然后,使用match,我们找到列索引,cbind它与行索引,并将值分配给地点被NA占领

i1 <- is.na(df$Var) 
df$Var[i1] <- df[cbind(1:nrow(df), match(paste0("X", df$Idx), names(df)[3:4])+2)][i1]
df
#   Idx Var X12 X34
#1  12 444 444 100
#2  34 777 500 777
#3  12 300 600 900