2015-11-24 2 views
2

Если предположить, что у меня есть следующий data.frame:Объединить 2 колонки в dataframe по приоритетам один из них

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

Как compine эти столбцы в одном, говоря, что первый столбец имеет приоритет «», это означает, что если оба столбца имеют значение, то из первого. SO результат должен быть:

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

редактировать: где <NA> не доступны значения.

+1

Эти реальные 'NA's, как если бы я' is.na (ДФ) '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 с использованием is.na(df) <- df == "<NA>", а затем попробуйте первое решение.

+0

довольно хороший способ. –

+0

Я думаю, что решение akruns 'ifelse' проще. Это решение является более общим в том смысле, что неважно, сколько у вас колоний, оно всегда будет работать с одним и тем же кодом, отдавая предпочтение первому столбцу. –

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 
Смежные вопросы