Как изменить значения tibble в длинном формате - PullRequest
1 голос
/ 07 октября 2019

Я хочу нормализовать с помощью min / max значения двух индикаторов. Можно ли сделать это, сохраняя тибл в длинном формате? (Ниже я использую левое соединение, чтобы сделать это в широком формате).

library(tidyverse)

df <- tibble(ind =c(1, 2),
             `2015` = c(3,10),
             `2016` = c(7,18),
            `2017` = c(1,4))

# long format
df2 <- df %>%
    gather("year", "value", 2:4)

df3 <- df2 %>%
    group_by(ind) %>%
    summarise(mn = min(value),
              mx = max(value))

# wide format? 
df4 <- left_join(df2, df3, by = c("ind"="ind"))

df5 <- df4 %>%
  mutate(value2 = (value-mn)/(mx-mn))
Created on 2019-10-07 by the reprex package (v0.3.0)

1 Ответ

2 голосов
/ 07 октября 2019

Вместо выполнения left_join можно создавать столбцы с mutate и избегать шага summarise

library(dplyr)
df2 %>% 
    group_by(ind) %>%
    mutate(mn = min(value), mx = max(value)) %>%
    ungroup %>%
    mutate(value2 = (value - mn)/(mx-mn))

ПРИМЕЧАНИЕ. Здесь мы предположили, что OP хотел получить столбцы mx,'Mn' в окончательном выводе. Но, если целью является получение только 'value2', нет необходимости создавать дополнительные столбцы, как @Gregor упоминается в комментариях

df2 %>%
    group_by(ind) %>%
    mutate(value2 = (value - min(value))/(max(value) - min(value)))

Кроме того, с tidyr_1.0.0 вместоgather, можно использовать pivot_longer, который является более обобщенным, поскольку он может иметь дело с несколькими наборами столбцов для изменения формы от 'wide' к 'long'

library(tidyr)
df %>% 
   pivot_longer(cols = -ind) %>% 
   group_by(ind) %>% 
   mutate(mn = min(value), mx = max(value))  %>%
   ungroup %>%
   mutate(value2 = (value - mn)/(mx-mn))
...