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