我有一个数据框,如下所示:
df =
A B C D E F
1 NA NA 10.2 8.9 abc
2 NA NA 65.1 7.6 def
3 76.1 10.1 NA NA ghi
4 10.1 10.4 NA NA jkl
5 NA NA NA NA mno
最后,我需要它看起来像这样:
df =
A B C F
1 10.2 8.9 abc
2 65.1 7.6 def
3 76.1 10.1 ghi
4 10.1 10.4 jkl
5 NA NA mno
NA
和C
中的所有D
都需要替换为D
和E
中的值(如果它们有值)!所有其他列都需要保留!
答案 0 :(得分:2)
ifelse
在这些情况下效果很好。
library(dplyr)
mutate(df, B = ifelse(is.na(B), D, B),
C = ifelse(is.na(C), E, C))
答案 1 :(得分:1)
使用base R,这应该既快又可扩展(对很多列):
foo <- function(x, y) pmax(x, y, na.rm=TRUE)
cols1 = c("B", "C")
cols2 = c("D", "E")
df[, cols1] = with(df, Map(foo, mget(cols1), mget(cols2)))
df = df[, !(names(df) %in% cols2), drop = FALSE]
或使用data.table v1.9.5
的相同概念 - 安装说明here
require(data.table) # v1.9.5+
setDT(df)[, (cols1) := Map(foo, mget(cols1), mget(cols2))][, (cols2) := NULL]
这个想法很简单。每个列对使用pmax
na.rm=TRUE
,一次使用Map()
。