2013-03-13 7 views
1

Я пытаюсь объединить два фрейма данных с различным количеством столбцов и заголовков столбцов. Однако после того, как я их объединять с использованием rbind.fill(), полученный файл заполнил пустые ячейки NA.Можете ли вы использовать rbind.fill, не заполняя NA?

Это очень неудобно, так как один из столбцов имеет данные, которые также представлены как «NA» (для Северной Америки), поэтому, когда я импортирую его в csv, электронная таблица не может отличить их друг от друга.

Есть ли способ для меня:

  1. Используйте функцию rbind.fill без его заполнения пустых ячеек с НС

или

  1. Изменить столбец, чтобы заменить NA *

* Я обыскивали блоги, и попробовал два наиболее популярных решений:

df$col[is.na(df$col)] <- 0, #it does not work 
df$col = ifelse(is.na(df$col), "X", df$col), #it changes all the characters to numbers, and ruins the column 

Позвольте мне знать, если у вас есть какие-либо советы! Я (к сожалению) не могу разделить df, но готов ответить на любые вопросы!

+0

Строка «я t не работает "не является встроенным сообщением об ошибке в R. – 2013-03-13 20:50:59

+0

Просьба представить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Если вы не можете поделиться своим фреймом данных, сделайте небольшой пример, который реплицирует вашу проблему. –

+5

Вы пытались изменить опцию 'na' для write.csv? – blindjesse

ответ

3

NA - это не то же самое, что "NA" - R, но может быть интерпретировано как таковое вашей любимой программой для работы с электронными таблицами. NA - это особое значение в R как NaN (не число). Если я правильно понимаю, один из ваших решений, чтобы заменить значения «NA» в колонке, представляющей Северную Америку с чем-то еще, в этом случае вы просто должны быть в состоянии сделать ...

df$col[ df$col == "NA" ] <- "NorthAmerica" 

Это предполагает что ваши значения «NA» на самом деле являются символьными строками. is.na() не вернет никаких значений, если они являются символьными строками, поэтому df$col[ is.na(df$col) ] <- 0 не будет работать.

Пример разницы между НС и «НС»:

x <- c(1, 2, 3 , "NA" , 4 , 5 , NA) 

> x[ !is.na(x) ] 
[1] "1" "2" "3" "NA" "4" "5" 

> x[ x == "NA" & !is.na(x) ] 
[1] "NA" 

метод для решения этой проблемы

Я думаю, что вы хотите оставить «NA», и любые NA с, как они в первый df, но сделать все NA во втором df, образованном с rbind.fill(), изменить на что-то вроде «NotAvailable». Вы можете сделать это как так ...

df1 <- data.frame(col = rep("NA" , 6) , x = 1:6 , z = rep(1 , 6)) 
df2 <- data.frame(col = rep("SA" , 2) , x = 1:2 , y = 5:6) 
df <- rbind.fill(df1 , df2) 
temp <- df [ (colnames(df) %in% colnames(df2)) ] 
temp[ is.na(temp) ] <- "NotAvailable" 
res <- cbind(temp , df[ !(colnames(df) %in% colnames(df2)) ]) 

#df has real NA values in column z and column y. We just want to get rid of y's 
df 

#  col x z y 
# 1 NA 1 1 NA 
# 2 NA 2 1 NA 
# 3 NA 3 1 NA 
# 4 NA 4 1 NA 
# 5 NA 5 1 NA 
# 6 NA 6 1 NA 
# 7 SA 1 NA 5 
# 8 SA 2 NA 6 

#res has "NA" strings in col representing "North America" and NA values in z, whilst those in y have been removed 
#More generally, any NA in df1 will be left 'as-is', whilst NA from df2 formed using rbind.fill will be converted to character string "NotAvilable" 
res 

#  col x   y z 
# 1 NA 1 NotAvailable 1 
# 2 NA 2 NotAvailable 1 
# 3 NA 3 NotAvailable 1 
# 4 NA 4 NotAvailable 1 
# 5 NA 5 NotAvailable 1 
# 6 NA 6 NotAvailable 1 
# 7 SA 1   5 NA 
# 8 SA 2   6 NA 
+0

На самом деле, значения «NA» для Северной Америки исправлены. I хотите изменить значение «null» NA для чего-то еще, например, «-» – David

+0

@ David, я отредактировал, надеюсь, это поможет –

+0

@ David выполнило ли это решение ниже? Вам нужно настроить больше? –

1

Если у вас есть dataframe, который содержит NA, и вы хотите заменить их все, что вы можете сделать что-то вроде:

df[is.na(df)] <- -999 

Это будет заботиться о всех NA-х в одном кадре

Если вы хотите, чтобы действовать на одной колонке, вы можете сделать что-то вроде

df$col[which(is.na(df$col))] <- -999 
+0

Я пробовал это в своем первоначальном вопросе, но, к сожалению, это не повлияло на мою таблицу. Спасибо хоть! – David