我正在努力解决这个问题。 我有这样的数据:
item id
1 500
2 500
2 600
2 700
3 500
3 600
data.frame(item = c(1, 2, 2, 2, 3, 3),
id = c(500, 500, 600, 700, 500, 600))
我想计算一对项目链接到同一个ID的次数。 所以我想要这个输出:
item1 item2 count
1 2 1
2 3 2
1 3 2
我尝试使用以下命令来解决这个问题:
x_agg = aggregate(x, by=list(x$id), c)
然后
x_agg_id = lapply(x_agg$item, unique)
认为我可以计算每个项目的出现次数。但by
函数似乎创建了一个列表对象,我不知道如何操作。我希望有一种更简单的方法......
答案 0 :(得分:3)
# your data
df<-read.table(text="item id
1 500
2 500
2 600
2 700
3 500
3 600",header=TRUE)
library(tnet)
item_item<-projecting_tm(df, method="sum")
names(item_item)<-c("item1","item2","count")
item_item
#item1 item2 count
#1 1 2 1
#2 1 3 1
#3 2 1 1
#4 2 3 2
#5 3 1 1
#6 3 2 2
修改强>
你有多少ids和物品?你总是可以重命名。 e.g。numberitems<-length(unique(df$id))+9000
items<-data.frame(item=unique(df$item),newitems=c(9000:(numberitems-1)))
numberids<-length(unique(df$id))+1000
ids<-data.frame(id=unique(df$id),newids=c(1000:(numberids-1)))
newdf<-merge(df,items,by="item")
newdf<-merge(newdf,ids,by="id")
DF<-data.frame(item=newdf$newitems,id=newdf$newids)
library(tnet)
item_item<-projecting_tm(DF, method="sum")
names(item_item)<-c("item1","item2","count")
然后合并原来的名字......
答案 1 :(得分:2)
我建议使用这种方法,因为从您的示例输出中不清楚来自@ user1317221_G的答案是否正是您要查找的内容。在该示例中,组合2 3
计为 4 次,item1 = 2, item2 = 3
计算两次,item1 = 3, item2 = 2
计算两次。
我会尝试combn
功能。它没有给你完全你正在寻找的相同输出,但可能适合于那个目的。
这是一个例子。
编写一个基本函数,它将生成我们提供的任何组合。
myfun = function(x) { apply(combn(x, 2), 2, paste, sep="", collapse="") }
split()
item
数据的id
列,lapply
并使用id
生成temp = split(df$item, df$id)
# Drop any list items that have only one value--combn won't work there!
temp = temp[-(which(sapply(temp,function(x) length(x) == 1),
arr.ind=TRUE))]
temp1 = lapply(temp, function(x) myfun(unique(x)))
内的组合。
unlist
使用table
然后table(unlist(temp1))
#
# 12 13 23
# 1 1 2
将每种组合的频率制成表格。
data.frame
如果您愿意,可以拥有data.frame(table(unlist(temp)))
# Var1 Freq
# 1 12 1
# 2 13 1
# 3 23 2
。
myfun = function(x) { apply(combn(x, 2), 2, paste, sep="", collapse=",") }
temp = split(df$item, df$id)
temp = temp[-(which(sapply(temp,function(x) length(x) == 1),
arr.ind=TRUE))]
temp1 = lapply(temp, function(x) myfun(unique(x)))
temp1 = data.frame(table(unlist(temp1)))
OUT = data.frame(do.call(rbind,
strsplit(as.character(temp1$Var1), ",")),
temp1$Freq)
names(OUT) = c("item1", "item2", "count")
OUT
# item1 item2 count
# 1 1 2 1
# 2 1 3 1
# 3 2 3 2
如上所述,使用更多的肘部油脂,您也可以使用此方法来匹配您想要的输出:
{{1}}