将长格式数据重新整形到事务表

时间:2017-04-22 17:17:40

标签: r reshape

我在R中为配方提供了长格式数据,其中每个成分按行列出:

house     rec          ingr
 98 leche de soya Leche de soya
 98 leche de soya           pan
 98         arroz         arroz 
 98         arroz        aceite
 98         arroz          agua
 98         arroz       cebolla
 98         pollo         pollo
 98         pollo           sal
 98         pollo        aceite
 98  papas fritas          papa
 98  papas fritas        aceite
 98  carne de res  carne de res
 98  carne de res        aceite
124       Platano       platano
124       Platano         queso
124          cafŽ          cafŽ
124          cafŽ        azucar
124          CafŽ          agua
124      majadito         arroz
124      majadito         carne

我想要每个独特食谱名称和房屋ID的成分。理想情况下,我想要一个962列宽的数据框(成分数),如果成分是否存在,则为1或0,或者是交易表,但是我被卡住了。

2 个答案:

答案 0 :(得分:2)

以下是使用spread()

执行此操作的方法
library(tidyverse)

dat <- data_frame(
  house.id = c(rep(98, 3), rep(124, 3)),
  recipe = c(
    'leche de soya',
    'leche de soya',
    'arroz',
    'arroz',
    'arroz',
    'arroz'
  ),
  ingredients = c(
    'Leche de soya',
    'pan',
    'arroz',
    'aceite',
    'agua',
    'cebolla'
  ),
  values = rep(1, 6)
)

dat <- spread(dat, ingredients, values, fill = 0)

答案 1 :(得分:0)

使用dcast()

library(data.table)
dcast(setDT(DT), house + rec ~ ingr, length)
   house           rec Leche de soya aceite agua arroz azucar caf<U+008E> carne carne de res
1:    98         arroz             0      1    1     1      0           0     0            0
2:    98  carne de res             0      1    0     0      0           0     0            1
3:    98 leche de soya             1      0    0     0      0           0     0            0
4:    98  papas fritas             0      1    0     0      0           0     0            0
5:    98         pollo             0      1    0     0      0           0     0            0
6:   124   Caf<U+008E>             0      0    1     0      0           0     0            0
7:   124       Platano             0      0    0     0      0           0     0            0
8:   124   caf<U+008E>             0      0    0     0      1           1     0            0
9:   124      majadito             0      0    0     1      0           0     1            0
   cebolla pan papa platano pollo queso sal
1:       1   0    0       0     0     0   0
2:       0   0    0       0     0     0   0
3:       0   1    0       0     0     0   0
4:       0   0    1       0     0     0   0
5:       0   0    0       0     1     0   1
6:       0   0    0       0     0     0   0
7:       0   0    0       1     0     1   0
8:       0   0    0       0     0     0   0
9:       0   0    0       0     0     0   0

请注意拼写错误的影响。

数据

DT <- readr::read_fwf(
 "  hs           rec          ingr
  98 leche de soya Leche de soya
  98 leche de soya           pan
  98         arroz         arroz 
  98         arroz        aceite
  98         arroz          agua
  98         arroz       cebolla
  98         pollo         pollo
  98         pollo           sal
  98         pollo        aceite
  98  papas fritas          papa
  98  papas fritas        aceite
  98  carne de res  carne de res
  98  carne de res        aceite
  124       Platano       platano
  124       Platano         queso
  124          cafŽ          cafŽ
  124          cafŽ        azucar
  124          CafŽ          agua
  124      majadito         arroz
  124      majadito         carne",
 skip = 1L,
 col_positions = readr::fwf_positions(c(3, 6, 20), c(5, 19, NA), c("house", "rec", "ingr")))