R:计算多个(!)列中多次出现的字符串

时间:2013-07-24 17:21:46

标签: r count plyr frequency

并且已经感谢大量关于我(尚未提出的)问题的文章,这让我更进一步!

但是,我仍然无法帮助它,而是提出另一个计算问题:

我有一个大约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包中?)。

感谢所有人,我希望这对你来说很简单;)

最佳, 人

2 个答案:

答案 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))