首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合两个向量单元

结合两个向量单元
EN

Stack Overflow用户
提问于 2012-09-20 11:14:53
回答 3查看 3K关注 0票数 8

我有两个向量,如下:

代码语言:javascript
复制
A <- c(1,2,NA,NA,NA,NA,7)
B <- c(NA,NA,3,4,NA,NA,7)

我想把它们结合起来,这样得到的向量是

代码语言:javascript
复制
1,2,3,4,NA,NA,-1

那是

  1. 当位置i的任一向量中只有一个值(例如X)存在(另一个是NA)时,新向量应取位置i处的值X。
  2. 当两个值在位置i处为NA时,新向量应取位置i处的NA值。
  3. 当两个向量在位置i处都有一个值时,新向量应该在位置i处取值-1。

我可以很容易地用一个循环来完成这个任务,但是在一个大的数据集中,它是非常慢的,所以任何人都能提供一种快速的方法来完成这个任务吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-20 11:24:54

这些命令创建了向量:

代码语言:javascript
复制
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
票数 11
EN

Stack Overflow用户

发布于 2012-09-20 11:25:12

代码语言:javascript
复制
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

基准:

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2012-09-20 12:11:30

有点晚了,但这里还有另一个选项,它定义了一个函数,将规则应用于两个向量cbind-ed。

代码语言:javascript
复制
# 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

使用函数的主要好处是可以更容易地更新规则或输入,从而将代码应用于新数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12511476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档