2016-11-30 25 views
0

我正在學習使用this previous post來更新列數據。然而,是否有一個技巧來指定哪個列應該提供最終更新值以防衝突。在R中,結合列刪除NA,但優先考慮特定替換

data <- data.frame('a' = c('A','B','C','D','E'), 
    'x' = c(NA,NA,3,NA,NA), 
    'y' = c(1,2,NA,NA,NA), 
    'z' = c(NA,NA,NA,4,5)) 
cbind.data.frame(data3[1], mycol=c(na.omit(c(t(data3[, -1]))))) 

我怎麼會強制值在以下情況下,來自newVal:例如,我可以,只要只有一個值每行存在合併的數據列?

data <- data.frame('a' = c('A','B','C','D','E','F'), 
        'x' = c(NA,NA,NA,3,NA,NA), 
        'y' = c(1,2,8,NA,NA,NA), 
        'z' = c(99,NA,4,NA,4,5)) 

回答

2

使用max.col和一些矩陣索引(指定要採取的行/列組合):

cbind(1:nrow(data), max.col(!is.na(data[-1]), "last")) 
#  [,1] [,2] 
#[1,] 1 3 
#[2,] 2 2 
#[3,] 3 3 
#[4,] 4 1 
#[5,] 5 3 
#[6,] 6 3 

data[-1][cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))] 
#[1] 99 2 4 3 4 5 

cbind(data[1], result=data[-1][cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))]) 
# a result 
#1 A  99 
#2 B  2 
#3 C  4 
#4 D  3 
#5 E  4 
#6 F  5 

如果你需要一個特定的列總是優先被考慮,使得與列的臨時對象按照特定的順序,然後處理它:

tmp <- data[-1][c("z", setdiff(names(data[-1]), "z"))] 
tmp[cbind(1:nrow(tmp), max.col(!is.na(tmp), "first"))] 
#[1] 99 2 4 3 4 5 
+0

我更新了我的示例以避免在最後一列查找最大值的小事例;它可能大於或小於。 – val

+1

@val - 代碼沒有選擇最大值,它選取跨列的最後一個非'NA'值。它可能不是數字最大值。你甚至嘗試過這些代碼嗎? – thelatemail

+0

我明白了。謝謝。而不是最大的列是否有一種方法來指定列應該從何而來? – val