我有一个数据框:
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
答案 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)
您可以将datatable
和eval
用于此
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