2015-06-03 3 views
1

У меня есть файл csv, где некоторые записи в некоторых столбцах пустые. У меня есть соответствующие столбцы, у которых есть данные, которые могут быть использованы для заполнения пустых полей. Скажем, один из столбцов с пробелами называется «Старая информация», а один из столбцов с информацией о замене называется «Новая информация». Я не хочу заменять старую информацию новой информацией, я хочу только заполнить пробелы в старой информации данными из новой информации. Данные будут поступать из той же строки, т. Е. Если Old Info Row 1 пуст, информация будет взята из New Info Row 1.Как заполнить пустые ячейки?

Кроме того, у меня есть вторичная колонка, которая также содержит информацию о замене, которую можно было бы назвать Secondary Информация о замене. Если Старый Info Строка 1 является пустым, и поэтому Новая информация Row 1, то я хотел бы, чтобы заменить старый Info Row 1 с Secondary Replacement Info Row 1. Вот некоторые примеры данных:

Old Info  New Info Secondary Replacement Info 
1  Carl   Carl    Carl 
2     Diana    Diana 
3  Jeremy  Jeremy    Jeremy 
4          Jack 

А вот желаемый результат :

Old Info  New Info Secondary Replacement Info 
1  Carl   Carl    Carl 
2  Diana  Diana    Diana 
3  Jeremy  Jeremy    Jeremy 
4  Jack       Jack 

так как вы можете видеть, пробела в Старой информации были восполнены Row 2 был заполнен новой информацией, но Row 4 был заполнен Secondary Replacement Info, как новый Info также имел. пустой. Как написать функцию, чтобы выполнить все это?

+0

и вы дон Не нужно заполнять последний столбец? –

+0

Хорошо, я просто добавил некоторые примеры данных и результатов, чтобы проиллюстрировать, что я собираюсь сделать. – xxxRxxx

+0

Попробуйте 'df1 [, 1] [df1 [, 1] == ''] <- df1 [, 2] [df1 [, 1] == '']; df1 [, 1] [df1 [, 1] = = ''] <- df1 [, 3] [df1 [, 1] == ''] 'Если в колонке информации вторичной замены содержатся все значения, вам может потребоваться только одна замена, то есть вторая. – akrun

ответ

3
#import your data 
#don't forget to set stringsAsFactors = FALSE 
DF <- read.csv(text = "Old Info,New Info,Secondary Replacement Info 
1,Carl,Carl,Carl 
2,,Diana,Diana 
3,Jeremy,Jeremy,Jeremy 
4,,,Jack", stringsAsFactors = FALSE) 

#a little function 
fun <- function(x, y, z) { 
    y[y == ""] <- z[y == ""] #substitute missings in y with values from z 
    x[x == ""] <- y[x == ""] #substitute missings in x with values from y 
    x #return 
} 

DF <- within(DF, Old.Info <- fun(Old.Info, New.Info, Secondary.Replacement.Info)) 
# Old.Info New.Info Secondary.Replacement.Info 
#1  Carl  Carl      Carl 
#2 Diana Diana      Diana 
#3 Jeremy Jeremy      Jeremy 
#4  Jack        Jack 
1

Это цикл for, который, вероятно, не настолько эффективен, но это функция, и она должна выполнить свою работу. Я ввожу файл, который я использовал для ввода, который представляет собой csv (например, ваш текст, но в отличие от вашего примера ввода), поэтому, пожалуйста, дайте мне знать, если я должен его отключить.

#read in csv file 
data = read.csv("/Users/amckenz/Documents/github/R-plots/SO/replace_data.txt", fill = T, na.strings = "") 

replace_missing_info <- function(data_df){ 

    for(i in 1:nrow(data_df)){ 
     print(i) 
     if(is.na(data_df[i, 1])){ 
      if(!is.na(data_df[i, 2])){ 
       data_df[i, 1] = data_df[i, 2] 
      } else if(!is.na(data_df[i, 3])){ 
       data_df[i, 1] = data_df[i, 3] 
      } 
     } 
    } 

    return(data_df) 

} 

updated_data = replace_missing_info(data_df = data) 

Входной файл данных:

Old Info,New Info,Secondary Replacement Info 
Carl,Carl,Carl 
,Diana,Diana 
Jeremy,Jeremy,Jeremy 
,,Jack 

ETA: обратите внимание, что я прочитал в пустые записи, как NA, так что вы можете использовать хорошую систему обработки NA R в, через na.strings = «» аргумент. Это может быть изменено, если ваши входные данные различны.

Второго редактирования (за комментарий): Если вы хотите получить доступ к столбцам имен, а номер столбца, вы можете использовать следующий код для вызова функции и функций вместо:

replace_missing_info <- function(data_df, column_with_blanks, 
    primary_replacement_column, secondary_replacement_column){ 

    for(i in 1:nrow(data_df)){ 
     print(i) 
     if(is.na(data_df[i, column_with_blanks])){ 
      if(!is.na(data_df[i, primary_replacement_column])){ 
       data_df[i, column_with_blanks] = data_df[i, primary_replacement_column] 
      } else if(!is.na(data_df[i, secondary_replacement_column])){ 
       data_df[i, column_with_blanks] = data_df[i, secondary_replacement_column] 
      } 
     } 
    } 

    return(data_df) 

} 

updated_data = replace_missing_info(data_df = data, "Old.Info", "New.Info", "Secondary.Replacement.Info") 
+0

Я бы использовал это, но я буду выполнять это на 7 отдельных файлах, каждый из которых имеет около 10000-30000 записей, поэтому, если есть способ сделать это, не используя цикл, который был бы лучше. В основном я использую R вместо Excel, чтобы избежать проблемы с большими периодами времени для обработки функций. – xxxRxxx

+0

Это почти наверняка будет быстрее, чем преуспеть. –

+0

Хорошо, это почти то, что я искал. Определенно восхищаюсь вашим использованием na.strings, очень удобно. Как я могу сделать это так, чтобы пользователь мог вводить текстовые имена столбцов, а не номера индексов столбцов в функцию? Это возможно сделать, но гораздо менее эффективно для пользователя. – xxxRxxx

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