5

我正在努力解决 R 中的这个问题。我有这样的数据:

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函数似乎创建了一个列表对象,我不知道如何操作。我希望有一个更简单的方法......

4

2 回答 2

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

编辑

你有多少个id和item?你总是可以重命名的东西。例如

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")

然后合并回原来的名字......

于 2012-08-22T11:47:32.837 回答
2

我建议采用这种方法,因为从您的示例输出中不清楚来自 @user1317221_G 的答案是否正是您正在寻找的。在该示例中,该组合2 3被计数4次,两次为item1 = 2, item2 = 3,两次为item1 = 3, item2 = 2

我会尝试这个combn功能。它不会为您提供与您正在寻找的完全相同的输出,但可能可以针对该目的进行调整。

这是一个例子。

  1. 编写一个基本函数,它将生成我们给它的任何组合。

    myfun = function(x) { apply(combn(x, 2), 2, paste, sep="", collapse="") }
    
  2. 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)))
    
  3. 使用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
于 2012-08-22T17:06:10.843 回答