基于转置创建多个csv文件

时间:2013-10-03 09:23:39

标签: r transpose

我的数据框如下所示:

CustID  item    sales
1       a1      40
1       a2      40
1       a3      34
1       a4      42
1       a5      21
1       a6      22
2       a1      33
2       a2      30
2       a3      21
2       a4      11
2       a5      19
2       a6      20

我需要创建2个转置数据集(它们应该是CSV),这样每个数据集都包含3个组中的项目......

输出:

csv1 (item 1-3)         
CustID  itema1  itema2  itema3
1         40      40     34
2         33      30     21

csv2 (item 4-6)         
CustID  itema4  itema5  itema6
1         42     21      22
2         11     19      20

请帮帮我

2 个答案:

答案 0 :(得分:3)

不是单线解决方案,但它可以满足您的需求。

首先使用splitdcast的组合,您可以创建和转置df。

> items <- split(df, df$item)
> 
> library(reshape2)
> dcast(do.call(rbind, items[1:3]), CustID~item )
  CustID a1 a2 a3
1      1 40 40 34
2      2 33 30 21

> dcast(do.call(rbind, items[4:6]), CustID~item )
  CustID a4 a5 a6
1      1 42 21 22
2      2 11 19 20

然后使用write.csv,您可以创建data.frame并将其保存到csv文件中。

以下是一次拍摄:

lapply(seq(1, length(items), 3), function(i){
  DF <- dcast(do.call(rbind, items[i:(i+2)]), CustID~item )
  write.csv(DF, file = paste0("DF", i, ".csv"))
})

答案 1 :(得分:2)

这是另一种方法,使用基础R的xtabs

x <- xtabs(sales ~ CustID + item, mydf)
x
#       item
# CustID a1 a2 a3 a4 a5 a6
#      1 40 40 34 42 21 22
#      2 33 30 21 11 19 20

^^第一步为您转换数据。

fileout <- list(A = 1:3, B = 4:6)

在这里,我们为每个CSV创建了要导出的列的命名列表。列表项的名称将用于CSV文件名。

以下是如何使用lapply编写CSV文件的示例。

lapply(seq_along(fileout), function(y) 
  write.csv(x[, fileout[[y]]], 
            file = paste(names(fileout[y]), ".csv", sep = "")))