合并列以删除NA,但优先考虑特定替换

时间:2016-11-30 01:17:32

标签: r dataframe updates overwrite

我正在学习使用this previous post更新列数据。但是,有一个技巧可以指定哪个列应该在发生冲突时提供最终更新的值。例如,只要每行只存在一个值,我就可以组合数据列:

data <- data.frame('a' = c('A','B','C','D','E'),
    'x' = c(NA,NA,3,NA,NA),
    'y' = c(1,2,NA,NA,NA),
    'z' = c(NA,NA,NA,4,5))
cbind.data.frame(data3[1], mycol=c(na.omit(c(t(data3[, -1])))))

在下列情况下,如何强制值来自newVal

data <- data.frame('a' = c('A','B','C','D','E','F'),
                   'x' = c(NA,NA,NA,3,NA,NA),
                   'y' = c(1,2,8,NA,NA,NA),
                   'z' = c(99,NA,4,NA,4,5))

1 个答案:

答案 0 :(得分:2)

使用max.col和一些矩阵索引(指定要采用的行/列组合):

cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    2
#[3,]    3    3
#[4,]    4    1
#[5,]    5    3
#[6,]    6    3

data[-1][cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))]
#[1] 99  2  4  3  4  5

cbind(data[1], result=data[-1][cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))])
#  a result
#1 A     99
#2 B      2
#3 C      4
#4 D      3
#5 E      4
#6 F      5

如果您需要始终优先使用特定列,请按特定顺序创建包含列的临时对象,然后对其进行处理:

tmp <- data[-1][c("z", setdiff(names(data[-1]), "z"))]
tmp[cbind(1:nrow(tmp), max.col(!is.na(tmp), "first"))]
#[1] 99  2  4  3  4  5