重塑数据框以按组将值设为列[重复]
Posted
技术标签:
【中文标题】重塑数据框以按组将值设为列[重复]【英文标题】:Reshape Dataframe to have values by Group be columns [duplicate] 【发布时间】:2017-03-21 14:45:44 【问题描述】:我有一个这样的数据框:
Partner Item
A ab
A ac
A ad
A ed
B ol
B le
C ef
E ab
E ol
E ef
E at
E ok
我想把它转换成:
Partner Col1 Col2 Col3 Col4 Col5
A ab ac ad ed
B ol le
C ef
E ab ol ef at ok
在某些情况下,我将使用arules
包将我的数据帧转换为事务类以调用apriori
算法。
我想这样做的方法是转换原始数据框。将其保存为单独的文件,然后使用read.transactions
再次调用它。
任何帮助都会很棒,谢谢!
【问题讨论】:
【参考方案1】:您需要为此使用 dcast。如果您有大型数据集,请查看 data.table 中的 dcast。否则,reshape2 中的那个就可以了。
library(reshape2)
df2 = dcast(df, Partner ~ Item, value.var = "Item")
这会给我们
Partner ab ac ad at ed ef le ok ol
1 A ab ac ad <NA> ed <NA> <NA> <NA> <NA>
2 B <NA> <NA> <NA> <NA> <NA> <NA> le <NA> ol
3 C <NA> <NA> <NA> <NA> <NA> ef <NA> <NA> <NA>
4 E ab <NA> <NA> at <NA> ef <NA> ok ol
然后,我们只需要设置列名并用“”填写NAs
colnames = paste("Col",1:length(unique(df$Item)), sep = "")
colnames(df2) = c("Partner",paste("Col",1:length(unique(df$Item)), sep = ""))
df2[is.na(df2)] <- ""
Partner Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9
1 A ab ac ad ed
2 B le ol
3 C ef
4 E ab at ef ok ol
要排序,你可以这样做
tmp = df2[, 2:ncol(df2)]
tmp = t(apply(tmp, 1, sort, decreasing = TRUE))
df3 = cbind.data.frame(df2[,1],tmp)
colnames(df3) = c("Partner",paste("Col",1:length(unique(df$Item)), sep = ""))
> df3
Partner Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9
1 A ed ad ac ab
2 B ol le
3 C ef
4 E ol ok ef at ab
可能有一种更有效的方法来做到这一点。 Apply 将 DF 转换为矩阵进行排序。不过,我不确定如何在不使用它的情况下执行此操作。
【讨论】:
这很棒@Kristofersen。您将如何对其进行排序,以便所有内容从左到右读取,而不是在左侧有空格?所以最终输出看起来像我的最终输出 @NickKnauer 我添加了一种排序方法。可能有更好的方法,但这是我能想到的。以上是关于重塑数据框以按组将值设为列[重复]的主要内容,如果未能解决你的问题,请参考以下文章