2017-10-18 70 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