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