我的数据框如下所示:
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
请帮帮我
答案 0 :(得分:3)
不是单线解决方案,但它可以满足您的需求。
首先使用split
和dcast
的组合,您可以创建和转置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 = "")))