WedX - журнал о программировании и компьютерных науках

Замена значений NA на 0 в R

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

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

Даже если я попытаюсь заменить NA в отдельных кадрах данных следующим образом:

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

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

РЕДАКТИРОВАТЬ: вывод 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 ...
21.08.2013

  • Можете ли вы поделиться выводом dput(head(data)) и str(data)? 21.08.2013
  • Вам не хватает закрывающего ) в for (i in length(data){. 21.08.2013
  • И for( i in 1:length(data) ){...}. 21.08.2013
  • упс, да, я пропустил закрытие ) и 1:length(data), но это только потому, что я быстро набрал его здесь, он находится в исходном коде и все еще не работает 21.08.2013
  • @joran Я добавил выходные данные для dput(head(data)) и str(data) 21.08.2013
  • У вас проблема с данными. Некоторые из ваших столбцов АН закодированы как символы. 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. 21.08.2013
  • @ Доктор Майк здесь прав. Ваши записи NA представляют собой строки, а не значения NA, поэтому функция 'is.na' работает неправильно. Попробуйте data[[i]][data[[i]]=="NA"] <- 0 и посмотрите, поможет ли это. 21.08.2013
  • Похоже, что NA на самом деле является символом NA, поэтому `x[x == NA] ‹- 0' должно работать. 21.08.2013
  • Спасибо @Dr.Mike за то, что заметили это, теперь работает отлично! 21.08.2013
  • @Dr.Mike Пожалуйста, напишите и отправьте свой ответ, чтобы мы могли закрыть это должным образом. 21.08.2013

Ответы:


1

Проблема в ваших данных. Некоторые из ваших столбцов АН закодированы как символы. "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, и ваш код должен работать нормально.

22.08.2013
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]