我从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
进行比较?
答案 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()函数将产生每个列的最大值。