Я не был уверен, как исправить логику вашего цикла, поэтому я попытался найти решение, которое дало ожидаемый результат.
Сначала я преобразовал в форму "long" / "tidy" (котораятребуется немного дополнительной работы для mtcars
).
library(tidyverse)
mtcars_tidy <- mtcars_mod %>%
rownames_to_column("model") %>%
gather(stat, value, -model) %>%
mutate_at(vars(model:stat), forcats::as_factor) %>% # as_factor to preserve order
# BTW, the character "NA"s aren't numeric, so convert to missing value NA's
mutate(value = value %>% as.numeric()) %>%
arrange(model) %>%
group_by(model) %>% mutate(col_num = row_number()) %>% ungroup()
head(mtcars_tidy, 14)
Теперь я добавляю NA, используя ваши правила.Чтобы убедиться, что это работает, сначала я отмечаю строки, которые должны сработать после NA.Затем в каждой группе я заменяю значения для следующих четырех записей.Я уверен, что есть более сжатые и быстрые способы сделать это, но я хотел, чтобы процесс был понятен.
mtcars_NA_applied <- mtcars_tidy %>%
# Test looks for values under 3.01 or missing (NA), only in certain rows
mutate(test = (value < 3.01 | is.na(value)) & col_num %% 5 == 2) %>%
# Now we change the next four values. I'm sure there's a more elegant way!
group_by(model) %>%
mutate(value = case_when(lag(test,1) ~ NA_real_,
lag(test,2) ~ NA_real_,
lag(test,3) ~ NA_real_,
lag(test,4) ~ NA_real_,
TRUE ~ value)) %>%
ungroup() %>%
# Now remove the helper columns and make the table wide again
select(-col_num, -test) %>%
spread(stat, value)
Кажется, что работает.
> head(mtcars_NA_applied, 8)
# A tibble: 8 x 12
model mpg cyl disp hp drat wt qsec vs am gear carb
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0 1 4 4
2 Mazda RX4 Wag 21 NA NA NA NA NA 17.0 0 1 4 4
3 Datsun 710 22.8 4 108 93 3.85 2.32 3 NA NA NA NA
4 Hornet 4 Drive 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
5 Hornet Sportabout 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
6 Valiant 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
7 Duster 360 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
8 Merc 240D 24.4 4 147. 62 3.69 3.19 NA NA NA NA NA
Примерданные
mtcars_mod<- mtcars
mtcars_mod[2,2]="NA";
mtcars_mod[3,7]=3;
mtcars_mod[8,7]="NA"
mtcars_mod