переформатировать набор данных из длинного в широкий набор данных - PullRequest
0 голосов
/ 30 мая 2019

Надеюсь, вы можете помочь моему вопросу.

У меня набор данных выглядит следующим образом.Всего 1500 строк.

+-------+---------+---------+--------+
| index |   item  |  taste  |  price |
+-------+---------+---------+--------+
|     1 |  orange |  low    |      3 |
|     1 | banana  |  medium |      4 |
|     1 |  pier   |  high   |      2 |
|     2 | apple   | medium  |      4 |
|     2 |  orange |  medium |      4 |
|     2 |  banana |  medium |      3 |
|   ... | ...     | ...     |    ... |
|  1500 | 1500    |  1500   |   1500 |
+-------+---------+---------+--------+

Я использую этот код, но получил сообщение об ошибке:

library(data.table)

dcast(setDT(df), index ~ item, value.var = c("taste", "price"))

Масштаб ошибки:

Ошибка в .subset2(x, i, точный = точный): нижний индекс вне границ. Дополнительно: предупреждающее сообщение: In if (! (value.var% in% names (data))) {: условие имеет длину> 1 и только первый элементбудет использоваться

это ожидаемый результат, который я хочу получить.

index, item, taste_orange,taste.banana, taste.pier, taste.apple, price_orange,price.banana, price.pier, price.apple, 
1, low,medium,high,0,3,4,2,0
2, medium,medium,0,medium,4,3,0,4
...,...,...,...,...,...,...,....,...
1500,1500, 1500,1500,1500,1500,1500,1500,1500

Заранее спасибо!

1 Ответ

0 голосов
/ 30 мая 2019

Если вы не возражаете против подхода Tidyverse, вы можете сделать что-то вроде:

library(tidyverse)
test <- read_delim(file=clipboard(), 
  col_names=TRUE, delim=",", trim_ws=TRUE) ## copied your 6 lines of data into the clipboard
test %>% 
  gather(key, value, -item, -index) %>% 
  unite("names", item, key) %>% 
  spread(names, value) %>% 
  mutate_at(vars(ends_with("_price")), as.numeric)
# A tibble: 2 x 9
  index apple_price apple_taste banana_price banana_taste orange_price
  <dbl>       <dbl> <chr>              <dbl> <chr>               <dbl>
1     1          NA NA                     4 medium                  3
2     2           4 medium                 3 medium                  4
# … with 3 more variables: orange_taste <chr>, pier_price <dbl>,
#   pier_taste <chr>

Команда «collect» создает «длинный» фрейм данных, в котором переменная «key» содержит тип информациисохраняются (т. е. вкус и цена), а переменная «value» содержит фактические значения;поскольку значения имеют различный тип, числовые значения приводятся в символ.«объединить» объединяет в новый столбец «имена» описание элемента и тип информации.«spread» создает новый столбец для каждого значения столбца «names» с соответствующими значениями.Последний бит (mutate_at) преобразует цены обратно в числовой формат.

...