Как транспонировать набор данных определенным образом в R - PullRequest
3 голосов
/ 10 апреля 2020

Не могли бы вы помочь мне с этим. У меня есть набор данных такого типа.

sample <- matrix(c(1, 'A', 0.17,
                   1, 'B', 0.80,
                   1, 'C', 0.10,
                   1, 'D', 0.35,
                   2, 'A', 0.44,
                   2, 'B', 0.24,
                   2, 'C', 0.39,
                   2, 'D', 0.65,
                   3, 'A', 0.61,
                   3, 'B', 0.94,
                   3, 'C', 0.19,
                   3, 'D', 0.65), nrow=12, ncol=3, byrow=T)

colnames(sample) <- c('year', 'country', 'X')
as.data.frame(sample)

, который выводит

   year country    X
1     1       A 0.17
2     1       B  0.8
3     1       C  0.1
4     1       D 0.35
5     2       A 0.44
6     2       B 0.24
7     2       C 0.39
8     2       D 0.65
9     3       A 0.61
10    3       B 0.94
11    3       C 0.19
12    3       D 0.65

Какой прием мне нужен для получения набора данных, подобного следующему?

year    A     B       C       D
1   0.17    0.80    0.10    0.35
2   0.44    0.24    0.39    0.65
3   0.61    0.94    0.19    0.65

Ответы [ 4 ]

0 голосов
/ 11 апреля 2020

Базовая опция R использует reshape, как показано ниже

dfout <- reshape(df,
                 direction = "wide",
                 idvar = "year",
                 timevar = "country")

, так что

> dfout
  year  X.A  X.B  X.C  X.D
1    1 0.17  0.8  0.1 0.35
5    2 0.44 0.24 0.39 0.65
9    3 0.61 0.94 0.19 0.65
0 голосов
/ 10 апреля 2020

То, что вы пытаетесь выполнить, sh называется преобразованием набора данных из длинного в широкий.

При использовании пакета reshape это должно делать следующее:

d_long <- melt ( yourdatasetname, id.vars = c ("год")) </p>

d_wide <-dcast (d_long, год ~ страна, сумма) </p>

0 голосов
/ 10 апреля 2020

Ссылаясь на ответ ColorStatistics, набор данных уже выглядит в расплавленном виде. Достаточно просто сделать дкаста.

> data<-as.data.frame(sample)
> library(data.table)
> dtable <- dcast(data = data, year~country) 
> dtable
      year    A    B    C    D
1    1 0.17  0.8  0.1 0.35
2    2 0.44 0.24 0.39 0.65
3    3 0.61 0.94 0.19 0.65
0 голосов
/ 10 апреля 2020

В вашем коде отсутствует первая или две строки, поэтому я его немного переформатировал. Вот решение, использующее tidyr:

library(dplyr)
library(tidyr)
df <- read.table(text = 
      "1,  'A',    0.17
       1,  'B',    0.80
       1,  'C',    0.10
       1,  'D',    0.35
       2,  'A',    0.44
       2,  'B',    0.24
       2,  'C',    0.39
       2,  'D',    0.65
       3,  'A',    0.61
       3,  'B',    0.94
       3,  'C',    0.19
       3,  'D',    0.65", sep = ",", strip.white = TRUE)

colnames(df)<-c('year', 'country',  'X')

df %>%
  arrange(year, country) %>%
  pivot_wider(names_from = country, values_from = X)
#> # A tibble: 3 x 5
#>    year     A     B     C     D
#>   <int> <dbl> <dbl> <dbl> <dbl>
#> 1     1  0.17  0.8   0.1   0.35
#> 2     2  0.44  0.24  0.39  0.65
#> 3     3  0.61  0.94  0.19  0.65

Создано в 2020-04-10 пакетом Представить (v0.3.0)

...