如何使用tapply并保留值的顺序

Bea*_*eld 6 r

希望这不是一个太愚蠢的问题,但仍然是一个R初学者我有一个严重的问题与tapply.让我们说

factors <- as.factor( c("a", "b", "c", "a", "b", "c", "a", "b", "c") )
values  <- c( 1, 2, 3, 4, 5, NA, 7, NA, NA )
tapply(
  values,
  factors,
  function(x){
    if( sum(is.na(x)) == 1 ){
      x[ is.na(x) ] <- 0
    }
    return(x)
  }
)
Run Code Online (Sandbox Code Playgroud)

结果是

$a
[1] 1 4 7

$b
[1] 2 5 0

$c
[1]  3 NA NA
Run Code Online (Sandbox Code Playgroud)

但是,我需要的是获得一个保留原始值顺序的向量,即:

c( 1,2,3,4,5,NA,7,0,NA )
Run Code Online (Sandbox Code Playgroud)

提前谢谢了.

42-*_*42- 7

在这种情况下,您应该使用该ave功能:

> ave(values, factors, FUN=function(x) {
+     if( sum(is.na(x)) == 1 ){
+       x[ is.na(x) ] <- 0
+     }
+     return(x)
+   }
+ )
[1]  1  2  3  4  5 NA  7  0 NA
Run Code Online (Sandbox Code Playgroud)