2016-09-01 3 views
1

Моя цель состоит в объединении двух наборов данных, но мне нужно отслеживать «NA», мне нужно «NA», когда я объединяю df1 и df2, а «NA» df1 присваивает что-то вроде 9999. Проблема заключается в том, что у моих данных есть так много переменных, она включает в себя день, числовой, символ ..., поэтому, когда я пытаюсь установить «NA» из df1 на df1[is.na(df1)] <- 9999, он работает только с числами, есть способ, которым я могу приблизиться к моему решение иметь разные НС отдельно.Объединить и изменить NA отдельно в R

df1 <- data.frame(ID= c(1:10), 
       Value=c(3,NA,7,2:8), 
       Group = c("A",NA,"C","D",NA,"B",NA,"C","D",NA)) 

df2 <- data.frame(ID = c(5:14),Count =c(1:9,NA), 
        School = c("A",NA,"C","D",NA,"B","NA","C","D",NA)) 

df1[is.na(df1)] <- 9999 

data <- merge(df1,df2,all = TRUE,by= "ID") 

    ID Value Group Count School 
1 1  3  A NA <NA> 
2 2 9999 <NA>* NA <NA> 
3 3  7  C NA <NA> 
4 4  2  D NA <NA> 
5 5  3 <NA>* 1  A 
6 6  4  B  2 <NA> 
7 7  5 <NA>* 3  C 
8 8  6  C  4  D 
9 9  7  D  5 <NA> 
10 10  8 <NA>*  6  B 
11 11 NA <NA>  7  NA 
12 12 NA <NA>  8  C 
13 13 NA <NA>  9  D 
14 14 NA <NA> NA <NA> 

Те * предположим, что 9999

ответ

1

Я хотел бы внести свой вклад в этот вопрос. Если у вас есть, скажем, 100 столбцов в разных классах и попытайтесь заменить все НС, вы можете попробовать следующее. Идея состоит в том, что вы конвертируете все столбцы в символ и заменяете все NA на 9999. Затем вы хотите преобразовать классы столбцов в исходные классы. Наконец, вы объединяете df1 и df2.

library(dplyr) 

# Save original classes. 
original <- unlist(lapply(df1, class)) 

# Convert all columns to character and replace NAs with 9999 
mutate_all(df1, as.character) %>% 
mutate_each(funs(recode(., .missing = "9999"))) -> df1 

# http://stackoverflow.com/questions/7680959/convert-type-of-multiple-columns-of-a-dataframe-at-once 
# Credit to joran for this function. 

convert.magic <- function(obj,types){ 

for (i in 1:length(obj)){ 
    FUN <- switch(types[i],character = as.character, 
          numeric = as.numeric, 
          factor = as.factor, 
          integer = as.integer, 
          logical = as.logical) 
     obj[,i] <- FUN(obj[,i]) 
    } 
    obj 
} 

out <- convert.magic(df1, original) %>% 
     full_join(df2, by = "ID") 

out 

# ID Value Group Count School 
#1 1  3  A NA <NA> 
#2 2 9999 9999 NA <NA> 
#3 3  7  C NA <NA> 
#4 4  2  D NA <NA> 
#5 5  3 9999  1  A 
#6 6  4  B  2 <NA> 
#7 7  5 9999  3  C 
#8 8  6  C  4  D 
#9 9  7  D  5 <NA> 
#10 10  8 9999  6  B 
#11 11 NA <NA>  7  NA 
#12 12 NA <NA>  8  C 
#13 13 NA <NA>  9  D 
#14 14 NA <NA> NA <NA> 
+1

Это помогает много и быстрее, когда я занимаюсь большими данными. – BIN

+0

@BIN. Я рад это слышать. – jazzurro

1

Вы можете попробовать заменить NA значения df1$Group перед выполнением слияния:

df1$Group <- as.character(df1$Group) 
df1$Group[is.na(df1$Group)] <- 9999 

Но у меня есть ощущение, что вы знаете, это уже, но были отбрасывается, потому что df1$Group является фактором, означающим, что приведенный выше код не будет работать так, как ожидалось, если вы не произнесли первый раз, используя as.character. Вы также можете сделать эту замену после слияния.

+0

проблема у меня есть более 100 переменных, чтобы отслеживать и расчет – BIN

+0

обновлять свой вопрос и сделать его представителем реальной проблемы, которую вы пытаетесь решить. Теперь неясно. –

+0

Я думаю, что все в порядке, я могу отделить все переменные и преобразовать их сначала, прежде чем применять 9999 – BIN

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