R 计数由列值链接的项对

R 计数由列值链接的项对,r,aggregation,R,Aggregation,我正在努力解决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

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

#您的数据
# 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

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

我会尝试
combn
功能。它不会给你完全相同的输出,你正在寻找,但可能会适应这一目的

这里有一个例子

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

    myfun = function(x) { apply(combn(x, 2), 2, paste, sep="", collapse="") }
    
  • split()
    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
    

    这太完美了,谢谢!这个“tnet”包对于我将要做的其他事情可能非常有用!哦,天哪,问题来了。我的一些项目/标识有非常大的值(10或11位),在处理大于9位的数字时,projecting_tm函数似乎会抛出一个错误。有更普遍的解决办法吗?“也许有一个可以让我使用字符串而不是整数的字符串?”HarryPalmer,您关心项目的顺序吗?例如,
    item1
    item2
    的1和2的组合是否与
    item1
    item2
    的2和1的组合相同?嗨,mrdwab,不,我不关心项目的顺序。非常感谢您的详细回复,我将在明天试用,并让您知道如何进行!嗯,我在>temp1=lappy(temp,function(x)myfun(unique(x)))之后得到了这个错误消息:警告消息:在combn(x,2):应用中强制错误引入的NAs(combn(x,2,paste,sep=“”,collapse=“”):在为函数“apply”选择方法时计算参数“x”时出错:在seq_len(x)中出错:参数必须强制为非负integer@HarryPalmer,您能
    dput
    处理几行数据吗,最好是您感觉出错的行?我只在这15行上运行相同的错误。整数的大小?结构(列表(id=c(909128296、5012895441、979322531、1475171536、5272803586、5377444521、6652900376、497636221、9708548701、5695003406、996433791、5317141656、7197368271、423477811、5953151441),isbn=c(9781405910248、9781405910248、9781405910248、9781405910248、9780141906201、9781405910248、9781405910248、9781405910248、9781405910248、9781405910248、9780141967899、9780141965635)),.Names=c(“id”、“isbn”、row.Names=c(NA、15L)、class=“data.frame”)
    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