2017-10-18 100 views
2

我有形式的数据帧:参考与“复合”名称的变量

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

我需要与由“IDX”中的“X”变量引用的适当的值,以取代在NAS中无功,所以如果Idx = 12,那么我们需要'X12'的值。所产生的数据帧将看起来像:

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


我试图concating的“IDX”与“X”但ř犯规认识到这一个有效的变量。我的尝试:

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 
+1

这样的事情,你通常会数据重塑成“长”(或“整洁”)格式。它使得生成的代码更容易理解。查看软件包。 –

回答

1

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

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

谢谢!迄今为止大多数R-ish解决方案。 – Liord

+0

@Liord乐意帮忙 – PoGibas

0

我们可以用一个行/列的索引。获取“无功”列(“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 
占用的地方
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 
+0

谢谢!与往常一样闪电般快速的data.table。请注意:学习(有点神秘)dt尽快。 – Liord

+0

Liord,你可以请upvote这个答案,如果你发现它有用 –

+0

试图upvote这个答案和PoGibas的答案,但是因为我有不到15的声誉系统表示它不会注册它。抱歉。 – Liord