2016-04-27 83 views
0

我正在分析來自公開數據庫的微陣列數據,我的輸出是將實驗數據與控件進行比較的對數比矩陣。我發現我的其中一列填充了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

回答

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 
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)))))