例如,对于向量,R等效

时间:2013-11-06 17:27:43

标签: r

我有一个有两列的矩阵,第一列有时是NA,并且想创建第三列,它是第一列的值,除非它是NA,在这种情况下它取第二列的值。到目前为止我有一个for循环,但我确信在R中有更好的方法。

matrixA$Age3 <- 1:length(matrixA$Age)
for(i in 1:length(matrixA$Age3))
{
  if(!is.na(matrixA$Age[i]))
  {
    matrixA$Age3[i] = matrixA$Age[i]
  }else
  {
    matrixA$Age3[i] = matrixA$Age2[i]
  }
}

2 个答案:

答案 0 :(得分:2)

matrix$Age3 <- ifelse(!is.na(matrix$Age),matrix$Age,matrix$Age2)

答案 1 :(得分:1)

也许,只是为了好玩,

matrix$Age3 <- sapply(1:nrow(matrix), function(j) matrix[j,(2-!is.na(foo[j,1]))])

(如果CSGillespie有这样的话可以道歉,因为他删除了他)

编辑:正如eddi所说,这里有一些扩展和测试我的想法。我现在正确地公开羞辱我的错误假设,即“ifelse”是一个timepig。 switch更容易阅读,但至少对于这个小数据集和有限的开关集,时差并不重要。 (我可能已经提供了确切的截止值,但这两个函数的有效运算在这里很重要。)

# foo is a 2e4 row by 5 column matrix of runif values 

ifelse4 <- function(foo) ifelse(foo[,1] > 0.8,foo[,2],ifelse(foo[,1] > 0.6,foo[,3],ifelse(foo[,1] > .4 , foo[,4],ifelse(foo[,1] > .2 , foo[,5], foo[,1])))) 

switch4l <- function(foo) {

 for(j in 1:nrow(foo)) {
         switch( ceiling(foo[j,1]*5),
            foo[j,1],
            foo[j,5],
            foo[j,4],
            foo[j,3],
            foo[j,2] )
        }
        }


    microbenchmark(ifelse4(foo),switch4l(foo),times=10)

    Unit: milliseconds
          expr      min       lq   median       uq      max neval
  ifelse4(foo) 31.37346 31.87336 32.21567 32.44509 33.21182    10
 switch4l(foo) 28.03629 28.31339 28.61871 28.99588 29.78014    10