Я пытаюсь очистить кадр данных, и я хотел бы заменить NA в одном столбце, с соответствующим значением из другого столбца. Я также хотел бы сделать это для нескольких столбцов сразу.Как заменить NA в нескольких столбцах на значение из соответствующих столбцов.
Пример данных.
set.seed(123)
dates <- seq(as.Date("2016-01-01"), by = "day", length = 10)
names <- rep(c("John Doe", "Jane Smith"), each = 5)
var1_group <- runif(10)
var2_group <- runif(10)
var1_person <- runif(10)
var2_person <- runif(10)
myDF <- data.frame(names, var1_group, var2_group, var1_person, var2_person)
myDF <- cbind(dates, myDF)
После некоторых манипуляций с использованием dplyr ...
myDF <- myDF %>% mutate_each(funs(lag), contains("group"))
myDF <- myDF %>% group_by(names) %>% mutate_each(funs(lag), contains("person"))
Я получаю кучу ... ВПЛ
dates names var1_group var2_group var1_person var2_person
1 2016-01-01 John Doe NA NA NA NA
2 2016-01-02 John Doe 0.2875775 0.95683335 0.8895393 0.9630242
3 2016-01-03 John Doe 0.7883051 0.45333416 0.6928034 0.9022990
4 2016-01-04 John Doe 0.4089769 0.67757064 0.6405068 0.6907053
5 2016-01-05 John Doe 0.8830174 0.57263340 0.9942698 0.7954674
6 2016-01-06 Jane Smith 0.9404673 0.10292468 NA NA
7 2016-01-07 Jane Smith 0.0455565 0.89982497 0.7085305 0.4777960
8 2016-01-08 Jane Smith 0.5281055 0.24608773 0.5440660 0.7584595
9 2016-01-09 Jane Smith 0.8924190 0.04205953 0.5941420 0.2164079
10 2016-01-10 Jane Smith 0.5514350 0.32792072 0.2891597 0.3181810
То, что я хотел бы сделать сейчас, заменить Nas из столбцов * _person с соответствующим значением из столбца * _group. (См ряд 6)
dates names var1_group var2_group var1_person var2_person
1 2016-01-01 John Doe NA NA NA NA
2 2016-01-02 John Doe 0.2875775 0.95683335 0.8895393 0.9630242
3 2016-01-03 John Doe 0.7883051 0.45333416 0.6928034 0.9022990
4 2016-01-04 John Doe 0.4089769 0.67757064 0.6405068 0.6907053
5 2016-01-05 John Doe 0.8830174 0.57263340 0.9942698 0.7954674
6 2016-01-06 Jane Smith 0.9404673 0.10292468 0.9404673 0.1029246
7 2016-01-07 Jane Smith 0.0455565 0.89982497 0.7085305 0.4777960
8 2016-01-08 Jane Smith 0.5281055 0.24608773 0.5440660 0.7584595
9 2016-01-09 Jane Smith 0.8924190 0.04205953 0.5941420 0.2164079
10 2016-01-10 Jane Smith 0.5514350 0.32792072 0.2891597 0.3181810
Это работает для одной колонки ...
myDF$var1_person <- ifelse(is.na(myDF$var1_person), myDF$var1_group, myDF$var1_person)
Но я хотел бы сделать это для всех столбцов сразу. В моем фактическом фрейме данных каждая группа составляет около 20 столбцов. Я пробовал кучу других вещей, но я не хочу загромождать этот пост своей глупостью.
* Бонусные баллы, если вы можете получить код для n переменных на основе префикса столбца.
var1_group > var1_person
var2_group > var2_person
...
varn_group > varn_person
Спасибо!
Ваша проблема возникает из-за того, что ваши данные не аккуратны - вы кодируете некоторое значение индекса в именах столбцов. Растопите данные в длинный формат (колонка 1 человек, 1 группа столбцов, 1 индексный столбец), затем сделайте замену, вернитесь в широкий формат. См. 'Reshape2' или' tidyr' для преобразования между длинными и широкими форматами. – Gregor
Кроме того, поскольку вы уже используете 'dplyr',' coalesce (var1_person, var1_group) 'эквивалентно вашему' 'ifelse()' statement. – Gregor
Насколько эффективен такой подход? Для очень большого кадра данных, скажем, 1 мил строк и 100 столбцов, будет ли это по-прежнему жизнеспособным?Я думал, что я мог бы также попытаться «применить» что-то вроде 'coalesce (col_list_person, col_list_group)' – JPete