试图通过关键变量将数据转换为行?关键变量是多重的

时间:2015-05-26 04:15:02

标签: r

customer_code   cateogry
8.92e+12    CONDIMENTI PRIMI (PELATI & SUGHI)
8.92e+12    accessoro
8.92e+12    sugaro
8.92e+13    CONDIMENTI PRIMI (PELATI & SUGHI)
8.92e+13    sugaro

需要输出

customer_code CONDIMENTI PRIMI (PELATI & SUGHI)      sugaro        accessoro         
8.92e+12                5                              10              5
8.92e+13               45                              2               NA

以这种方式需要结果。

5 个答案:

答案 0 :(得分:1)

使用它,可以看作是融化函数的反面:

    library(reshape2 )
    dcast(yourdata, customer_code ~ cateogry)

这将导致:

    customer_code   accessoro   CONDIMENTI PRIMI (PELATI & SUGHI)   sugaro
1   8.92e+12        accessoro   CONDIMENTI PRIMI (PELATI & SUGHI)   sugaro
2   8.92e+13        NA          CONDIMENTI PRIMI (PELATI & SUGHI)   sugaro

在此之后,如果需要,可以更改列名称。

感谢@chiwangc提供更好的输出格式。

答案 1 :(得分:1)

您可以使用基本R函数reshape()来执行此操作。有趣的是,你的timevar是一个变化的列,我以前没见过,但你可以通过复制列来使它工作:

df <- data.frame(customer_code=c(8.92e+12,8.92e+12,8.92e+12,8.92e+13,8.92e+13), category=c('CONDIMENTI PRIMI (PELATI & SUGHI)','accessoro','sugaro','CONDIMENTI PRIMI (PELATI & SUGHI)','sugaro') );
reshape(transform(df,time=category),dir='w',idvar='customer_code');
##   customer_code category.CONDIMENTI PRIMI (PELATI & SUGHI) category.accessoro category.sugaro
## 1      8.92e+12          CONDIMENTI PRIMI (PELATI & SUGHI)          accessoro          sugaro
## 4      8.92e+13          CONDIMENTI PRIMI (PELATI & SUGHI)               <NA>          sugaro

此外,您可以通过将因子强制转换为整数来实现顺序积分后缀:

reshape(transform(df,time=as.integer(category)),dir='w',idvar='customer_code');
##   customer_code                        category.2 category.1 category.3
## 1      8.92e+12 CONDIMENTI PRIMI (PELATI & SUGHI)  accessoro     sugaro
## 4      8.92e+13 CONDIMENTI PRIMI (PELATI & SUGHI)       <NA>     sugaro

答案 2 :(得分:0)

您可以使用spread中的tidyr并更改列名称。

library(tidyr)
spread(df1, cateogry, cateogry)
#  customer_code accessoro CONDIMENTI PRIMI (PELATI & SUGHI) sugaro
#1      8.92e+12 accessoro CONDIMENTI PRIMI (PELATI & SUGHI) sugaro
#2      8.92e+13      <NA> CONDIMENTI PRIMI (PELATI & SUGHI) sugaro

答案 3 :(得分:0)

示例数据:

x <- data.frame(customer = sample(100, 1000, replace = TRUE), category = sample(LETTERS, 1000, replace = TRUE))

使用dplyr生成长格式:

 x %>% group_by(customer, category) %>% summarise(count = n())

reshape2用于宽幅格式:

acast(x, customer~category)

答案 4 :(得分:0)

您应该提供更好的可重现示例。我想你正在为每个顾客寻找类别项目的频率。

ID=c(8.92e+12,8.92e+13)
cat=c('CONDIMENTI PRIMI (PELATI & SUGHI)','accessoro','sugaro')
df <- as.data.frame(cbind(ID[sample(1:2,50,replace = T)], cat[sample(1:3,50,replace = T)]))

table(df[[1]], df[[2]])

以下是模拟50行的输出:

          accessoro CONDIMENTI PRIMI (PELATI & SUGHI) sugaro
  8.92e+12         8                                 8     10
  8.92e+13         8                                 4     12