0

我有一个如下所示的数据框:

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

请帮帮我

4

2 回答 2

2

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

首先使用 和 的组合,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.frames 并将其保存到 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"))
})
于 2013-10-03T09:32:56.880 回答
2

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

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 = "")))
于 2013-10-03T09:46:17.830 回答