在R中,组合列删除NA,但优先考虑具体替代 [英] in R, combine column to remove NA's yet prioritize specific replacements

查看:298
本文介绍了在R中,组合列删除NA,但优先考虑具体替代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在学习使用此前的帖子更新列数据。但是,是否有一个技巧来指定在出现冲突的情况下哪列应该提供最终的更新值。例如,只要每行只存在一个值,我可以组合数据列:

I'm learning to update column data using this previous post. However, is there a trick for specifying which column should provide the final updated value in case of a conflict. For example, I can combine columns of data as long as only one value exists per row:

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

How would I force the value to come from newVal in the following case?

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))


推荐答案

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

Use max.col and some matrix indexing (specifying which row/col combination to take):

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

如果您需要一个特定的列来始终被赋予优先级,则使用临时对象一个特定的顺序,然后处理它:

If you need a particular column to always be given precedence, make a temporary object with the columns in a particular order, and then process it:

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

这篇关于在R中,组合列删除NA,但优先考虑具体替代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆