Dplyr и Tidyverse => условно заменяют все переменные (проходя через набор данных) - PullRequest
0 голосов
/ 06 декабря 2018

Это простой вопрос, но ответ занимает у меня больше времени, чем следовало бы.Ближайший ответ, который я нашел, был один .Итак, я здесь - как всегда - чтобы попросить о помощи!

Допустим, у меня есть набор данных с 6 переменными (y1-y6), и мне нужно заменить все значения перед полом на "NA"и все значения после потолка с" NA ".

Итак, эти данные Original dataset

будут такими же, как следующие:

new dataset

Чтобы прояснить вопрос, мне нужно пометить запись как NA, если переменная находится за пределами пола ипотолок.Другими словами, в строке second следующего изображения y1 необходимо заменить на NA (потому что слово y2), а y6 также должно бытьзаменить на NA, поскольку потолок равен y5.

Я - пользователь dplyr, и я буду рад, если в ответе используется среда Tidyverse.

Большое спасибо, как всегда!

ds <- data.frame(floor = c(1:2),
                 ceiling = c(4,5),
                 y1 = c(1,2),
                 y2 = c(1,2),
                 y3 = c(1,2),
                 y4 = c(1,2),
                 y5 = c(1,2),
                 y6 = rep(c(1,2),3))

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете начать с создания функции, которая определяет, находится ли переданный индекс внутри набора границ, присваивая NA, если оно есть, или назначая отдельное переданное значение, если это не так.Здесь x - это индекс столбца, val - это значение, которое вы хотите присвоить, если не NA, low - это нижняя граница (этаж), а high - верхняя граница (потолок):

altMask <- function(x, val, low, high){
  sapply(1:length(x), function(idx){
    ifelse(between(x[idx], low[idx], high[idx]), val[idx], NA)
  })
}

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

ds %>%
  mutate(rowIdx = 1:n()) %>%
  gather(col, value, starts_with("y")) %>%
  mutate(value = altMask(parse_number(col), value, floor, ceiling)) %>%
  spread(col, value) %>%
  arrange(rowIdx) %>%
  select(-rowIdx)

Возвращает:

  floor ceiling y1 y2 y3 y4 y5 y6
1     1       4  1  1  1  1 NA NA
2     2       5 NA  2  2  2  2 NA
3     1       4  1  1  1  1 NA NA
4     2       5 NA  2  2  2  2 NA
5     1       4  1  1  1  1 NA NA
6     2       5 NA  2  2  2  2 NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...