2014-02-20 263 views
1

我一直試圖弄清楚整整一天的情況,但是我對循環的理解並不是最好的。 我基本上有3個數據幀。它們包含幾列。我想一次檢查每個數據幀。如果列中的一個值爲-9999(NA),我想用其他數據幀中的值替換它(如果第二個數據幀中的相同值也是-9999,則它應取第3個值)。R替換多個數據幀的多個列的值

我想通了,否則。我無法把它變成一個for循環。所以我必須手工輸入每個列,這需要很長時間,因爲我有很多列名稱奇怪的列。所以這裏是我的例子,以簡單的形式。也許有些人可以幫助我。非常感謝,王蓮香

par1 <- c(1,2,3,4) 
par2 <- c(1,2,3,0) 
par3 <- c(1,0,3,8) 
par4 <- c(1,0,3,9) 

r <- data.frame(par1, par2, par3, par4) 
d <- data.frame(par1, par2, par3, par4) 
b <- data.frame(par1, par2, par3, par4) 

r$par1[4] <- -9999 

gap_filling <- function(x,y,z){ 
    ifelse (x == -9999, 
      ifelse(y==-9999, z, y), 
      x) 
} ## this is the function I wrote to shorten it a little bit 

r$par1 <- gap_filling(r$par1, d$par1, b$par1) 
r$par2 <- gap_filling(r$par2, d$par2, b$par2) 
r$par3 <- gap_filling(r$par3, d$par3, b$par3) 
r$par4 <-gap_filling(r$par4, d$par4, b$par4) 

### this is just the replacing for the first data frame. I need to do the same with the other two too 

回答

1

(編輯的版本,這要歸功於傑克Burkead的評論)

你真正想要的是邏輯索引的力量。

例如:

r[r==-9999] <- d[r==-9999] 
r[r==-9999] <- b[r==-9999] 
# # Alternate writing, if you have 'NA' instead of -9999 
# # r[is.na(r)] <- matrix.d[is.na(r)] 
# # r[is.na(r)] <- matrix.b[is.na(r)] 
+1

你可以做到這一點'data.frames '以及 –

+1

'ifelse(r == -9999,ifelse(b == -9999,d,as.matrix(b)),as.matrix(r))'也可能有幫助。 –

+0

非常好,我編輯的答案 - 謝謝@Jake :) – Jealie

0

你可以在一個名爲list組織rbd並繼續爲@Jealie和@JakeBurkhead建議:

l <- list(r=r, d=d, b=b) 
invisible(lapply(1:length(l), function(i) { 
    for (x in setdiff(1:length(l), i))  
     l[[i]] [ l[[i]] == -9999] <<- l[[x]] [ l[[i]] == -9999] 
})) 
invisible(list2env(l, envir=.GlobalEnv)) # overwrite existing r, d, b 
+0

嘿,謝謝。我試圖用我的data.frames,但我得到這個錯誤信息:包裝過程中的錯誤:不能脅迫類型'字符'的向量類型'承諾' 包裝過程中出現錯誤:目標上下文不在堆棧上 包裝過程中出錯:不能強制類型'承諾'類型'字符'的向量 包裝過程中出現錯誤:目標上下文不在堆棧上我猜這裏的問題也是,我的數據幀長度不一樣? – user3330494