8

我有 2 个向量,例如:

A <- c(1,2,NA,NA,NA,NA,7)
B <- c(NA,NA,3,4,NA,NA,7)

我想将它们组合起来,以便生成的向量是

1,2,3,4,NA,NA,-1

那是

  1. 当位置 i 的任一向量中仅存在 1 个值(例如 X)时(另一个为 NA),新向量应在位置 i 处取值 X。

  2. 当两个值在位置 i 处均为 NA 时,新向量应在位置 i 处取值 NA

  3. 当两个向量在位置 i 处都有值时,新向量应在位置 i 处取值 -1。

我可以通过循环轻松地做到这一点,但是在大型数据集上它非常慢,所以任何人都可以提供一种快速的方法来做到这一点吗?

4

3 回答 3

11

这些命令创建向量:

X <- A
X[is.na(A)] <- B[is.na(A)]
X[is.na(B)] <- A[is.na(B)]
X[!is.na(A & B)] <- -1

#[1]  1  2  3  4 NA NA -1
于 2012-09-20T11:24:54.177 回答
5
A <- c(1,2,NA,NA,NA,NA,7)
B <- c(NA,NA,3,4,NA,NA,7)
C <- rowMeans(cbind(A,B),na.rm=TRUE)
C[which(!is.na(A*B))]<- -1
#[1]   1   2   3   4 NaN NaN  -1

基准:

Unit: microseconds
          expr    min     lq median     uq     max
1 Roland(A, B) 17.863 19.095 19.710 20.019  68.985
2   Sven(A, B) 11.703 13.243 14.167 14.783 100.398
于 2012-09-20T11:25:12.843 回答
2

聚会有点晚了,但这是另一个选项,它定义了一个函数,该函数通过将规则应用于两个向量cbind-ed 一起工作。

# get the data
A <- c(1,2,NA,NA,NA,NA,7)
B <- c(NA,NA,3,4,NA,NA,7)

# define the function
process <- function(A,B) {
  x <- cbind(A,B)
  apply(x,1,function(x) {
    if(sum(is.na(x))==1) {na.omit(x)} else
    if(all(is.na(x))) {NA} else
    if(!any(is.na(x))) {-1}
  })
}

# call the function
process(A,B)
#[1]  1  2  3  4 NA NA -1

The main benefit of using a function is that it is easier to update the rules or the inputs to apply the code to new data.

于 2012-09-20T12:11:30.340 回答