2015-11-24 83 views
2

假設我有以下data.frame之一:合併2列數據幀由它們優先

Value1 Value2 
    'a'  <NA> 
    <NA>  'b' 
    <NA>  'c' 
    'd'  'e' 
    'f'  'g' 
    <NA>  <NA> 

我如何可以說,第一列具有「優先」 compine在一個這些列,這意味着如果兩欄都有第一欄的價值。所以結果應該是:

Value3 
    'a' 
    'b' 
    'c' 
    'd' 
    'f' 
    <NA> 

編輯:其中<NA>是不可用的值。

+1

這些是真正的'NA's因爲如果我這樣做'is.na(DF)'R將他們呢? –

+0

'ifelse(!is.na(d $ Value1),d $ Value1,d $ Value2)' – jogo

回答

4

下面是使用max.col一個簡單的方法(我假設這是真實的NA S)

df[cbind(1:nrow(df), max.col(!is.na(df), ties.method = "first"))] 
# [1] "a" "b" "c" "d" "f" NA 

如果這些都不是真正的NA S,你可以做

df[cbind(1:nrow(df), max.col(df != "<NA>", ties.method = "first"))] 

或可選擇地轉換他們NA s使用is.na(df) <- df == "<NA>"然後嘗試第一個解決方案。

+0

相當不錯的方法。 –

+0

我想akruns'ifelse'解決方案更簡單。這種解決方案更具有普遍性,因爲它無關你有多少columsn,它將始終使用相同的代碼,同時優先考慮第一列。 –

3

我們可以試試data.table。我們將'data.frame'轉換爲'data.table'(setDT(df1))。如果'Value1'中有NA值,我們將'Value2'元素分配給'Value1',移除'Value2'列並將列名改爲'Value3'。

library(data.table) 
setnames(setDT(df1)[is.na(Value1), Value1:= Value2 
       ][, Value2:= NULL], 'Value3') 
df1 
# Value3 
#1:  a 
#2:  b 
#3:  c 
#4:  d 
#5:  f 
#6:  NA 

另一種流行的方式是ifelse

with(df1, ifelse(is.na(Value1), Value2, Value1)) 
#[1] "a" "b" "c" "d" "f" NA