重塑数据框以按组为列的值
Reshape Dataframe to have values by Group be columns
我有一个这样的数据框:
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
包将我的数据帧转换为事务 class 以调用 apriori
算法。
我想要这样做的方式是将原始数据帧转换为这样。将其保存为单独的文件,然后使用 read.transactions
.
再次调用它
任何帮助都会很棒,谢谢!
您将需要为此使用 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
然后,我们只需要设置列名,NA填入""
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 变成矩阵进行排序。不过,我不确定如何在不使用它的情况下执行此操作。
我有一个这样的数据框:
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
包将我的数据帧转换为事务 class 以调用 apriori
算法。
我想要这样做的方式是将原始数据帧转换为这样。将其保存为单独的文件,然后使用 read.transactions
.
任何帮助都会很棒,谢谢!
您将需要为此使用 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
然后,我们只需要设置列名,NA填入""
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 变成矩阵进行排序。不过,我不确定如何在不使用它的情况下执行此操作。