从is.nan返回错误的逻辑

时间:2016-04-27 16:28:20

标签: r apply

我正在分析来自公开数据库的微阵列数据,我的输出是一个对数比矩阵,将实验数据与对照进行比较。我发现我的一个列中填充了NaN值,因为此处理没有相应的控件。我的数据框(fc_initial)尺寸为9049 x 647。

> dim(fc_initial)
[1] 9049  647

由NaN填充的列是第580列

head(fc_initial[,580])
# [1] NaN NaN NaN NaN NaN NaN

summary(is.nan(fc_initial[,580]))
#    Mode    TRUE    NA's 
# logical    9049       0 

当我尝试使用apply检查所有列时,R会错误地返回此列的所有FALSE

fc_num <- apply(fc_initial, 2, is.nan)
summary(fc_num[ ,580])
#    Mode   FALSE    NA's 
# logical    9049       0 

我已使用fc_initialfc_num的视图直观地确认了这一点,我已经仔细检查过我正在使用which()查找正确的列。

which(fc_num, arr.ind = TRUE)
#  row col

which不会返回显示为TRUE的单元格。

我错过了什么?为什么R为FALSE的一列值返回TRUE列,我已在视觉上确认为<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="e:\path_tolog\WebTrace.svclog" /> <-- Path to the log file </listeners> </source> </sources> </system.diagnostics>

2 个答案:

答案 0 :(得分:0)

调用apply时,数据框被强制转换为矩阵。如果有任何字符列,则整个数据框被强制转换为字符矩阵,并且所有NaN都转换为NA

df_1 <- data.frame(a=c("a","b","c"), b=c(NaN, NaN,NaN))
df_2 <- data.frame(a=c(1,2,3), b=c(NaN, NaN,NaN))

as.matrix(df_1)

     a   b 
[1,] "a" NA
[2,] "b" NA
[3,] "c" NA

as.matrix(df_2)
     a   b
[1,] 1 NaN
[2,] 2 NaN
[3,] 3 NaN

答案 1 :(得分:0)

即兴创作@cactusWoman和@joran评论:

## this gives count of nan's by column for your data.frame
sapply(fc_initial, function(y) sum(length(which(is.nan(y)))))