Как я могу изменить индексы строк и столбцов кадра данных в R? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть кадр данных в R, который имеет три столбца Product_Name (название книги), Year и Units (количество проданных единиц в этом году), который выглядит следующим образом:

Product_Name            Year     Units
A Modest Proposal       2011     10000
A Modest Proposal       2012     11000
A Modest Proposal       2013     12000
A Modest Proposal       2014     13000
Animal Farm             2011     8000 
Animal Farm             2012     9000
Animal Farm             2013     11000
Animal Farm             2014     15000
Catch 22                2011     1000
Catch 22                2012     2000
Catch 22                2013     3000
Catch 22                2014     4000
....

Я намерен сделать панель инструментов R Shiny с тем, где я хочу сохранить год в качестве опции выпадающего меню, для которого я хотел бы иметь фрейм данных в следующем формате

       A Modest Proposal   Animal Farm  Catch 22 
2011    10000               8000         1000
2012    11000               9000         2000
2013    12000               11000        3000
2014    13000               15000        4000

или наоборот, где Продукт Имена - это индексы строк, а Year - это индексы столбцов.

Как я могу сделать это в R?

Ответы [ 3 ]

2 голосов
/ 26 марта 2020

Ваша общая проблема - преобразование длинных данных в широкие. Для этого вы можете использовать функцию data.table dcast (среди многих других):

dt = data.table(
  Name = c(rep('A', 4), rep('B', 4), rep('C', 4)),
  Year = c(rep(2011:2014, 3)), 
  Units = rnorm(12)
)

> dt
    Name Year       Units
 1:    A 2011 -0.26861318
 2:    A 2012  0.27194732
 3:    A 2013 -0.39331361
 4:    A 2014  0.58200101
 5:    B 2011  0.09885381
 6:    B 2012 -0.13786098
 7:    B 2013  0.03778400
 8:    B 2014  0.02576433
 9:    C 2011 -0.86682584
10:    C 2012 -1.34319590
11:    C 2013  0.10012673
12:    C 2014 -0.42956207


> dcast(dt, Year ~ Name, value.var = 'Units')
   Year          A           B          C
1: 2011 -0.2686132  0.09885381 -0.8668258
2: 2012  0.2719473 -0.13786098 -1.3431959
3: 2013 -0.3933136  0.03778400  0.1001267
4: 2014  0.5820010  0.02576433 -0.4295621

В следующий раз будет проще, если вы предоставите воспроизводимый пример так, чтобы люди, помогающие вам, не должны вручную воссоздавать вашу структуру данных:)

1 голос
/ 26 марта 2020

Вам необходимо использовать pivot_wider из пакета tidyr. Я предположил, что ваши данные сохранены в df, и вам также нужен пакет dplyr для%>% (piping)

library(tidyr)
library(dplyr)

df %>%
  pivot_wider(names_from = Product_Name, values_from = Units)
0 голосов
/ 26 марта 2020

Предполагая, что ваш фрейм данных упорядочен по Product_Name, а по году я сгенерирую искусственные данные, аналогичные вашим фреймам, попробуйте следующее:

Col_1 <- sort(rep(LETTERS[1:3], 4))
Col_2 <- rep(2011:2014, 3)
# artificial data
resp <- ceiling(rnorm(12, 5000, 500))

uu <- data.frame(Col_1, Col_2, resp)
uu
# output is
   Col_1 Col_2 resp
1      A  2011 5297
2      A  2012 4963
3      A  2013 4369
4      A  2014 4278
5      B  2011 4721
6      B  2012 5021
7      B  2013 4118
8      B  2014 5262
9      C  2011 4601
10     C  2012 5013
11     C  2013 5707
12     C  2014 5637
> 
> # Here starts
> output <- aggregate(uu$resp, list(uu$Col_1), function(x) {x})
> output
  Group.1  x.1  x.2  x.3  x.4
1       A 5297 4963 4369 4278
2       B 4721 5021 4118 5262
3       C 4601 5013 5707 5637
> 
output2 <- output [, -1]
colnames(output2) <- levels(as.factor(uu$Col_2))
rownames(output2) <- levels(as.factor(uu$Col_1))

# transpose the matrix
> t(output2)
        A    B    C
2011 5297 4721 4601
2012 4963 5021 5013
2013 4369 4118 5707
2014 4278 5262 5637
> # or convert to data.frame
> as.data.frame(t(output2))
        A    B    C
2011 5297 4721 4601
2012 4963 5021 5013
2013 4369 4118 5707
2014 4278 5262 5637
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...