我从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)
另外一个选项:
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
以相同的方式工作.