Изменение фрейма данных R с широкого на длинный с вычисляемым столбцом - PullRequest
1 голос
/ 05 мая 2020

У меня большой фрейм данных, который я пытаюсь преобразовать в длинный. Я также хочу захватить новый столбец в длинном формате.

Посмотрел пару сообщений , но застрял.

Например, У меня есть эти данные:

State   NumTotal    Num1    Num2    Num3    Num4
A       352         98      10      174     70
B       331         233     42      30      26

Мне нужны эти данные:

State   NumClass    Num
A       Num1        98
A       Num2        10
A       Num3        174
A       Num4        70
B       Num1        233
B       Num2        42
B       Num3        30
B       Num4        26

Единственный фактический результат, который я могу получить, - это этот код (где df_so является фреймом данных с данные):

long <- df_so %>%
  gather(State, NumTotal)

long

, который делает это:

State   NumTotal
Num1    98
Num1    233
Num2    10
Num2    42
Num3    174
Num3    30
Num4    70
Num4    26

Итак, я теряю значение State (A или B) и знаю, что мне нужно создать столбец NumClass, но не знаю, как это сделать.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Вы можете использовать функцию melt из data.table (есть также reshape2::melt, но он больше не поддерживается, поэтому data.table::melt следует отдавать предпочтение)

library(data.table)
setDT(df)
df2 <- melt(df, id.vars = "State")
data.table::setnames(df2, old = "variable", new = "NumClass")
1 голос
/ 05 мая 2020

Преемником gather является pivot_longer, который делает именно то, что вы хотите:

library(tidyr)
library(dplyr)

data <- tibble(State = c("A", "B"),
               NumTotal = c(352, 331),
               Num1 = c(98,233),
               Num2 = c(10, 42),
               Num3 = c(174, 30),
               num4 = c(70, 26))

data %>% 
  select(-NumTotal) %>% 
  pivot_longer(starts_with("Num"))

#> # A tibble: 8 x 3
#>   State name  value
#>   <chr> <chr> <dbl>
#> 1 A     Num1     98
#> 2 A     Num2     10
#> 3 A     Num3    174
#> 4 A     num4     70
#> 5 B     Num1    233
#> 6 B     Num2     42
#> 7 B     Num3     30
#> 8 B     num4     26

Сначала я снимаю выделение со столбца NumTotal, так как вы его не используете, затем переворачиваю таблицу в длинный формат, сопоставив префикс имени столбца, который вы хотите повернуть. Чтобы одновременно получить нужные имена выходных столбцов, вызовите pivot_longer следующим образом:

data %>% 
  select(-NumTotal) %>% 
  pivot_longer(starts_with("Num"), names_to = "NumClass", values_to = "NumTotal")

#> # A tibble: 8 x 3
#>   State NumClass NumTotal
#>   <chr> <chr>       <dbl>
#> 1 A     Num1           98
#> 2 A     Num2           10
#> 3 A     Num3          174
#> 4 A     num4           70
#> 5 B     Num1          233
#> 6 B     Num2           42
#> 7 B     Num3           30
#> 8 B     num4           26
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...