从is.nan返回不正确的逻辑

从is.nan返回不正确的逻辑

问题描述:

我正在分析来自公开数据库的微阵列数据,我的输出是将实验数据与控件进行比较的对数比矩阵。我发现我的其中一列填充了NaN值,因为这种治疗方法没有相应的控制。我的数据帧的(fc_initial)尺寸为9049 X 647从is.nan返回不正确的逻辑

> 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的一列值?

+4

如果'fc_initial'是实际上是一个data.frame,你可能会从阅读_very仔细阅读''apply'的Details部分的第一句,然后考虑'fc_initial'是否混合了字符/因子/数字列,可以从中受益。 (即考虑'sapply'而不是'apply')。 – joran

+0

非常感谢您的评论。数据框的第一列是探测器列表作为字符,这会导致您指出的行为。 'sapply'修复了这个问题,我将在未来知道这一点。 – scsuarez

当调用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 

即兴的@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)))))