我有一个有两列的矩阵,第一列有时是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]
}
}
答案 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