合并数据框中的2列,优先考虑其中一列

时间:2015-11-24 09:07:15

标签: r merge

假设我有以下data.frame:

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

如何通过说第一列具有'优先级'来合并这些列,这意味着如果两列都具有来自第一列的值。结果应该是:

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

编辑:<NA>不可用的值。

2 个答案:

答案 0 :(得分:4)

这是一个使用max.col的简单方法(我假设这些是真实的NA

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

如果这些不是真正的NA,你可以做

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

或者使用NA将其转换为is.na(df) <- df == "<NA>",然后尝试第一个解决方案。

答案 1 :(得分: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