并且已经感谢大量关于我(尚未提出的)问题的文章,这让我更进一步!
但是,我仍然无法帮助它,而是提出另一个计算问题:
我有一个大约30,000行和5列的大数据集,里面装满了名字。共有大约14,000个不同的名字。现在我感兴趣的是连续出现的名称,但不论名称是否在1,2,3栏中,依此类推。
作为一个例子,矩阵看起来像这样(可能是可怕的编码):
testmatrix<- matrix(nrow=52, ncol=5)
for (i in 1:5) {
testmatrix[,i]<-(sample(letters, replace=T))
}
data<-as.data.frame(testmatrix)
我的最终矩阵应该具有(在测试示例中)26行和26列(在“真实”数据集14,000x14,000中),所有共同出现。我可以使用aggregate
(我想),但是我必须为每个列 - 二元组(1-2,1-3,1-4等)生成大量的dfs - 也许在那里这是一个独特而简单的功能(甚至也可能在plyr包中?)。
感谢所有人,我希望这对你来说很简单;)
最佳, 人
答案 0 :(得分:2)
这样的事情可能会帮助你开始......
# an example matrix of letters
m <- matrix(sample(letters, 30, replace=T), nrow=6, ncol=5)
m
# the unique values in the matrix
vals <- sort(unique(as.vector(m)))
# rearrange the data so that each value is a column
bigm <- t(apply(m, 1, function(row) match(vals, row, nomatch=0)))
colnames(bigm) <- vals
bigm
# count the co-occurences of each value (diagonal is total number of rows with that value)
crossprod(bigm>0)
答案 1 :(得分:1)
我想不出一个可爱的功能性方法来做到这一点,但它的速度非常快。
x <- matrix(as.character(sample(1:14000,30000*5,replace=T)),30000,5)
countmat <- matrix(0,14000,14000,dimnames=list(as.character(1:14000),as.character(1:14000)))
for(i in 1:nrow(x))
{
xc <- table(x[i,],x[i,])
countmat[rownames(xc),colnames(xc)] <- countmat[rownames(xc),colnames(xc)]+xc
}
编辑:
然后我意识到有一种可爱的功能方法可以做到这一点,但它对我的机器来说太占用内存
x <- matrix(as.character(sample(1:14000,30000*5,replace=T)),30000,5)
cx <- adply(x,.margins=1,.fun=function(x)table(x,x))