在具有NA条目的矩阵上使用apply函数

Tan*_*tar 12 r

我从csv文件中读取数据.如果我在R中看到这个文件,我有:

  V1 V2  V3 V4  V5 V6 V7
1 14 25  83 64 987 45 78
2 15 65 789 32  14 NA NA
3 14 67  89 14  NA NA NA
Run Code Online (Sandbox Code Playgroud)

如果我想要每列中的最大值,我使用这个:

apply(df,2,max)
Run Code Online (Sandbox Code Playgroud)

这就是结果:

 V1  V2  V3  V4  V5  V6  V7 
 15  67 789  64  NA  NA  NA 
Run Code Online (Sandbox Code Playgroud)

但它适用于没有的列NA.如何更改我的代码,以及比较列NA

day*_*yne 27

您只需添加na.rm=TRUE到您的申请电话.

apply(df,2,max,na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)

注意:这确实假设每列至少有一个数据点.如果一个人不sum回来0.

基于评论的编辑

fft没有na.rm争论.因此,您需要编写自己的函数.

apply(df,2,function(x){fft(x[!is.na(x)])})
Run Code Online (Sandbox Code Playgroud)

例如:

df <- data.frame(matrix(5,5,5))
df[,3] <- NA

> df
  X1 X2 X3 X4 X5
1  5  5 NA  5  5
2  5  5 NA  5  5
3  5  5 NA  5  5
4  5  5 NA  5  5
5  5  5 NA  5  5

> apply(df,2,function(x){fft(x[!is.na(x)])})
$X1
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i
[5] 1.776357e-15+0i

$X2
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i
[5] 1.776357e-15+0i

$X3
complex(0)

$X4
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i
[5] 1.776357e-15+0i

$X5
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i
[5] 1.776357e-15+0i
Run Code Online (Sandbox Code Playgroud)


Fer*_*aft 5

另外一个选项:

sapply(apply(df,2,na.exclude), fft)
Run Code Online (Sandbox Code Playgroud)

编辑:如果apply()返回矩阵而不是列表,上面的代码可能会失败.如果没有NA例如,这将会发生.下面的代码修复了:

sapply(tapply(m, col(m), na.exclude), max)
Run Code Online (Sandbox Code Playgroud)

有趣的是,没有必要设置simplify=FALSE,因为tapply()只有在na.exclude()每列返回单个标量时才会简化; 在这种情况下sapply以相同的方式工作.