Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用'引用变量;复合材料';名称_R - Fatal编程技术网

R 使用'引用变量;复合材料';名称

R 使用'引用变量;复合材料';名称,r,R,我有一个数据框,格式如下: Idx Var X12 X34 12 NA 444 100 34 NA 500 777 12 300 600 900 我需要将Var中的NAs替换为“X”变量中由“Idx”引用的适当值,因此如果Idx=12,则需要“X12”的值。生成的数据帧如下所示: Idx Var X12 X34 12 444 444 100 34 777 500 777 12 300 600 900 我试着用“X”表示“Idx”,但R不认为这是一个有效的变量。我尝试的是: d

我有一个数据框,格式如下:

Idx Var X12 X34 
12 NA 444 100 
34 NA 500 777 
12 300 600 900 
我需要将Var中的NAs替换为“X”变量中由“Idx”引用的适当值,因此如果Idx=12,则需要“X12”的值。生成的数据帧如下所示:

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

我试着用“X”表示“Idx”,但R不认为这是一个有效的变量。我尝试的是:

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

我们可以使用行/列索引。获取'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

i1解决方案,我迭代每一行,询问
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]))

d$Var您可以为此使用
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

d对于类似的内容,您通常会将数据重塑为“长”(或“整齐”)格式。它使生成的代码更容易理解。查看套餐ètidyr›和èdplyr›。谢谢!到目前为止,大多数R-ish解决方案。@Liord很乐意帮忙,谢谢!与往常一样,data.table的速度非常快。我自己注意:尽快学习(有点神秘)dt。Liord,如果你发现这个答案有用,请你更新这个答案。我尝试更新这个答案和PoGibas的答案,但是因为我的声誉不足15,系统说它还不会注册。很抱歉
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