2013-08-21 3 views
0

Я пытаюсь заменить свои значения NA в файле data.frame на 0. Я знаю, что это очень простой вопрос, но по какой-то причине он не работает для меня. Это мой код до сих пор:Замена значений NA на 0 в R

library(XLConnect) 
filenames <- list.files(paste(mainDir,sep=""), pattern="Output.*xls", full.names=TRUE) 

data = lapply(filenames, function(f) { 
wb = loadWorkbook(f) 
readWorksheet(wb, sheet = getSheets(wb), startRow = 1, startCol = 1, header=TRUE) }) 

for (i in 1:length(data)){ 
data[[i]][is.na(data[[i]])] <- 0} 

Мои data содержит 6 кадров данных, каждый из которых выглядят примерно так:

X North South East West 
1 1  1.4  -0.8  NA  0.2 
2 2  0.8  0.1  NA  NA 
3 3  1.1  NA  0.3  NA 
4 4  0.7  -0.3 0.5  NA  
: :  :   :  :  : 
: :  :   :  :  : 

Даже если я пытаюсь заменить НС-й в отдельных кадрах данных, как это:

x<-data[[1]] 
x[is.na(x)]<-0 

он также не работает, но ошибок не возникает. Я проверил str(data) и мои данные, безусловно, в data.frame

EDIT: выход dput(head(data)), данные довольно велик, так это только первые несколько строк, и в конце несколько строк, но все это очень похоже

list(structure(list(X.......... = c("01", "02", "03", 
"04", "05", "06", "07", "08", "09", 
"10", "11", "12"), North = c("NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "159268.712943834", "159268.712943834", 
"159268.712943834", "NA", "NA"), South = c(0.606714762968571, 
0.814522728179517, 0.209726636027901, 0.0444084477658611, -0.374746980093072, 
-0.686918667591031, -0.00947578135844365, -0.579281055756145, 
-0.447180610635141, 0.0364485438280426, 0.293432135759165, -0.128575801748206 
), East = c(0.0453524581429493, -0.715043414690337, -0.726352946071858, 
-0.211008344503713, 0.159243426048929, 0.124256257795459, -0.971001351195061, 
-1.11413010910649, -0.608926167442848, -1.29473850887024, -1.2685456908235, 
-2.19150672218728) 
: 
: 
: 
: 
.Names = c("X..........", "North", "South", "East", "West"...... 
: 
: 
row.names = c(NA, -12L), class = "data.frame"), 
    structure(list(m = c(0, 0)), .Names = "m", row.names = c(NA, 
    -2L), class = "data.frame")) 

выход для str(data), снова есть много данных, но это все очень похоже, так вот первые несколько строк:

List of 6 
$ :'data.frame':  12 obs. of 24 variables: 
    ..$ X..........: chr [1:12] "01" "02" "03" "04" ... 
    ..$ North : chr [1:12] "NA" "NA" "NA" "NA" ... 
    ..$ South : num [1:12] 0.6067 0.8145 0.2097 0.0444 -0.3747 ... 
    ..$ East  : num [1:12] 0.0454 -0.715 -0.7264 -0.211 0.1592 ... 
+0

Можете ли вы поделиться выводами 'dput (head (data))' и 'str (data)'? – joran

+0

У вас отсутствует закрытие ')' in 'for (i in length (data) {'. –

+0

И 'for (i in 1: length (data)) {...}'. –

ответ

0

проблема с вашими данными. Некоторые из вас столбцы NA кодируются как символы. «NA» не распознается функцией is.na. См. Следующий пример:

is.na(c(2,3,5,"NA")) 
# FALSE FALSE FALSE FALSE 

Между прочим, следующий код делает то, что вы хотите.

is.na(c(2,3,5,NA)) 
# FALSE FALSE FALSE TRUE 

Просто замените «NA» на NA, и ваш код должен работать нормально.

Смежные вопросы