计算按列值链接的项目对

时间:2012-08-22 11:38:10

标签: r aggregation

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

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

2 个答案:

答案 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功能。它没有给你完全你正在寻找的相同输出,但可能适合于那个目的。

这是一个例子。

  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))) 内的组合。

    unlist
  3. 使用table然后table(unlist(temp1)) # # 12 13 23 # 1 1 2 将每种组合的频率制成表格。

    data.frame
  4. 如果您愿意,可以拥有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}}