2012-07-25 88 views
2

我想用另一個數據幀中的值替換一個數據幀中的值,前提是第一個數據幀中存在一個值。R:將數據幀中的值替換爲NA作爲佔位符

第一個數據幀由值爲1或0的值組成,NA爲佔位符。

a <- structure(list(A.1 = c(1L, 0L, NA, 1L, 1L, 0L), A.2 = c(1L, 1L, 
1L, NA, 1L, NA), A.3 = c(0L, NA, NA, 0L, NA, NA), A.4 = c(NA, 
1L, 1L, NA, 0L, NA), A.5 = c(NA, NA, 1L, NA, NA, NA), A.6 = c(NA, 
NA, 1L, NA, NA, 1L)), .Names = c("A.1", "A.2", "A.3", "A.4", 
"A.5", "A.6"), class = "data.frame", row.names = c(NA, -6L)) 

的第二數據幀由應該替換的1或0相對於NAS的他位置在第一數據幀

r <- structure(list(R.1 = c(45L, 33L, 44L, 24L, 32L, 22L), R.2 = c(33L, 
99L, 44L, 25L, 25L, 33L), R.3 = c(22L, 77L, 22L, NA, 26L, NA), 
    R.4 = c(NA, NA, 32L, NA, NA, NA)), .Names = c("R.1", "R.2", 
"R.3", "R.4"), class = "data.frame", row.names = c(NA, -6L)) 

目標是此值的:

d <- structure(list(D.1 = c(45L, 33L, NA, 24L, 32L, 22L), D.2 = c(33L, 
99L, 44L, NA, 25L, NA), D.3 = c(22L, NA, NA, 25L, NA, NA), D.4 = c(NA, 
77L, 44L, NA, 26L, NA), D.5 = c(NA, NA, 22L, NA, NA, NA), D.6 = c(NA, 
NA, 32L, NA, NA, 33L)), .Names = c("D.1", "D.2", "D.3", "D.4", 
"D.5", "D.6"), class = "data.frame", row.names = c(NA, -6L)) 

任何&所有建議歡迎。

+0

這個目標看起來就像第一個輸入。複製並粘貼錯誤? – MvG 2012-07-25 21:45:23

+0

@MvG是的,這是一個複製和粘貼錯誤。對於那個很抱歉! – Jose 2012-07-25 21:54:57

+0

當'a'和'r'有6個時,爲什麼'd'有5行? – Seth 2012-07-25 22:04:55

回答

6
d <- t(a) 
d[!is.na(d)] <- t(r)[!is.na(t(r))] 
t(d) 
    A.1 A.2 A.3 A.4 A.5 A.6 
[1,] 45 33 22 NA NA NA 
[2,] 33 99 NA 77 NA NA 
[3,] NA 44 NA 44 22 32 
[4,] 24 NA 25 NA NA NA 
[5,] 32 25 NA 26 NA NA 
[6,] 22 NA NA NA NA 33 

另外,注意t()返回一個矩陣,而不是data.frame

+0

+1高度簡潔。 – 2012-07-25 23:10:31

+0

完美!如此簡潔! – Jose 2012-07-25 23:32:48

3
d <- matrix(data=NA, ncol=ncol(a),nrow=nrow(a)) # Initialize matrix 

replacements <- t(r) # Transpose R for na.omit() 

# Replace 
for (x in 1:nrow(a)) { 
    locations <- which(!is.na(a[x,])) 
    d[x,locations] <- na.omit(replacements[,x]) 
    } 
+0

這也適用於! '數據= NA'後忘了逗號乾杯! – Jose 2012-07-25 23:34:22