假设我有以下data.frame:
Value1 Value2
'a' <NA>
<NA> 'b'
<NA> 'c'
'd' 'e'
'f' 'g'
<NA> <NA>
如何通过说第一列具有'优先级'来合并这些列,这意味着如果两列都具有来自第一列的值。结果应该是:
Value3
'a'
'b'
'c'
'd'
'f'
<NA>
编辑:<NA>
不可用的值。
答案 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