Мутировать и случай, когда проблема - dplyr - PullRequest
1 голос
/ 23 сентября 2019

У меня есть следующие данные, и я должен был создать новый столбец, используя mutate, детали которого, когда color = 'g', затем взять уровень в строке g минус показатель уровня в строке 'r'.

Затем аналогично с типом.Где type = 1, тогда возьмите соответствующий уровень минус уровень в строке типа 2.

library(dplyr)

d <- tibble(
  date = c("2018", "2018", "2018", "2019", "2019", "2019", "2020", "2020", "2020", "2020"),
  colour = c("none","g", "r", "none","g", "r", "none", "none", "none", "none"),
  type = c("type1", "none", "none", "type2", "none", "none", "none", "none", "none", "none"),
  level= c(78, 99, 45, 67, 87, 78, 89, 87, 67, 76))

Просто чтобы прояснить, я хочу, чтобы данные выглядели так.

Итак, данные должны выглядеть так:

d2 <- tibble(
    date = c("2018", "2018", "2018", "2019", "2019", "2019", "2020", "2020", "2020", "2020"),
    colour = c("none","g", "r", "none","g", "r", "none", "none", "none", "none"),
    type = c("type1", "none", "none", "type2", "none", "none", "none", "none", "none", "none"),
    level= c(78, 99, 45, 67, 87, 78, 89, 87, 67, 76),
  color_gap = c("NULL", 44, "NULL", "NULL", 9, "NULL", "NULL", "NULL", "NULL", "NULL"),
  type_gap = c(11, "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL"))

Я началиспользуйте mutate и case когда и дойдете до ниже.Тем не менее, я застрял в окончательной части расчета.Как мне сказать, что я хочу взять уровень цвета g - уровень цвета r?

d %>% 
  mutate(color_gap = case_when(color == "g" ~ level)%>%
 mutate(type_gap = case_when(type== "type1" ~ level)%>%
  ) -> d2

Кто-нибудь знает, как это сделать?

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 сентября 2019

Это вычитает первый уровень r из первого уровня g, второй уровень r из второго уровня g и т. Д. То же самое для type1 и type2.Это не имеет никаких проверок на всех.Он не проверяет, есть ли совпадающие r для каждого g, находятся ли они в ожидаемом порядке, находятся ли они в одной группе дат и т. Д. Он предполагает, что данные уже полностью отформатированы, как и ожидалось, поэтому будьте осторожны, используяэто на реальных данных.

d %>% 
  mutate(color_gap = replace(rep(NA, n()), colour == 'g', 
                             level[colour == 'g'] - level[colour == 'r']),
         type_gap = replace(rep(NA, n()), type == 'type1', 
                             level[type == 'type1'] - level[type == 'type2']))
# # A tibble: 10 x 6
#    date  colour type  level color_gap type_gap
#    <chr> <chr>  <chr> <dbl>     <dbl>    <dbl>
#  1 2018  none   type1    78        NA       11
#  2 2018  g      none     99        54       NA
#  3 2018  r      none     45        NA       NA
#  4 2019  none   type2    67        NA       NA
#  5 2019  g      none     87         9       NA
#  6 2019  r      none     78        NA       NA
#  7 2020  none   none     89        NA       NA
#  8 2020  none   none     87        NA       NA
#  9 2020  none   none     67        NA       NA
# 10 2020  none   none     76        NA       NA
0 голосов
/ 23 сентября 2019

вы могли бы сделать это с помощью group_by и изменить его.

Я предположил, что в date имеется только 1 строка, которая удовлетворяла бы каждому условию.

d %>% 
  mutate(color_gap = case_when(colour == "g" ~ level)) %>%
  mutate(type_gap = case_when(type== "type1" ~ level)) %>%
  group_by(date) %>%
  mutate(diff = max(color_gap,na.rm=T)-max(type_gap, na.rm=T))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...