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

时间:2013-09-16 12:48:02

标签: 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

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

apply(df,2,max)

这就是结果:

 V1  V2  V3  V4  V5  V6  V7 
 15  67 789  64  NA  NA  NA 

但它适用于没有NA的列。如何更改代码,将列与NA进行比较?

5 个答案:

答案 0 :(得分:22)

您只需在申请中添加na.rm=TRUE即可。

apply(df,2,max,na.rm=TRUE)

注意:这确实假设每列至少有一个数据点。如果没有,sum将返回0

基于评论的编辑

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

apply(df,2,function(x){fft(x[!is.na(x)])})

例如:

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

答案 1 :(得分:5)

另一种选择:

sapply(apply(df,2,na.exclude), fft)

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

sapply(tapply(m, col(m), na.exclude), max)

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

答案 2 :(得分:1)

另一个选项是,如果col的所有元素都是NA

,则返回-Inf
df<-structure(list(x = c(10, 12, 13), y = c(12, 13, NA), z = c(NA_real_, 
NA_real_, NA_real_)), .Names = c("x", "y", "z"), row.names = c(NA, 
-3L), class = "data.frame")

kk<-Map(function(x) max(na.omit(df[,x])),as.list(names(df)))
ll<-do.call(rbind,kk)
rownames(ll)<-names(df)

> ll

 [,1]
x   13
y   13
z -Inf

答案 3 :(得分:1)

这可能是由于后版本的结果,但您实际上可以这样做:

apply(df,2,function(x) max(x,na.rm=T))

这将为您返回向量或等效值:

lapply(df,function(x) max(x,na.rm=T))

这将返回一个列表。请注意,只要df中的任一列是一个字符,它都将无法返回所有NA。在这种情况下,您可能需要事先选择目标变量。

答案 4 :(得分:0)

另一种选择是使用以下内容:

apply(na.omit(df),2,max)

na.omit(df)只会从数据框 df 的每一列中删除不完整的案例,然后再删除 apply()函数将产生每个列的最大值。