有没有办法遍历R中的matrix / df来创建邻接矩阵?

时间:2019-06-26 14:36:42

标签: r loops apply

我试图遍历data.frame中的53行,并使用结果创建一个邻接矩阵。但是,由于循环无法正确运行,我的努力继续停滞。

我尝试创建匹配并应用许多count()函数,但均未成功。

MRE :(实际上,数据要大得多,所以我唯一的搜索实际上是217k个元素)

df1<-data.frame(col1=c(12345,123456,1234567,12345678),
col2=c(54321,54432,12345,76543),
col3=c(11234,12234,1234567,123345),
col4=c(54321,54432,12345,76543))

search<-c(12345,1234567,75643,54432)

我想遍历每一行并更新一个新的matrix / df,其中[搜索]中每个数字的计数将作为输出。

例如:

df2

        12345     1234567    75643    54432
row1    TRUE       TRUE      FALSE    FALSE
row2    FALSE      FALSE     TRUE      TRUE
row3    TRUE       TRUE      FALSE    FALSE
row4    TRUE       FALSE     TRUE     TRUE

2 个答案:

答案 0 :(得分:1)

我认为您应该检查tf (term frequency) algorithm进行文本挖掘。对于您的示例,这里有一个有趣的方法,使用library(quanteda)创建带有计数的矩阵。然后,您可以根据次数进行所需的搜索:

library("tibble")
library("quanteda")


df1<-data.frame(col1=c(12345,123456,1234567,12345678),
                col2=c(54321,54432,12345,76543),
                col3=c(11234,12234,1234567,123345),
                col4=c(54321,54432,12345,76543))
df2<-apply(df1,2,paste, collapse = " ") # Passing it to string format
DocTerm <- quanteda::dfm(df2)
DocTerm

Document-feature matrix of: 4 documents, 10 features (60.0% sparse).
4 x 10 sparse Matrix of class "dfm"
      features
docs   12345 123456 1234567 12345678 54321 54432 76543 11234 12234 123345
  col1     1      1       1        1     0     0     0     0     0      0
  col2     1      0       0        0     1     1     1     0     0      0
  col3     0      0       1        0     0     0     0     1     1      1
  col4     1      0       0        0     1     1     1     0     0      0

我希望这会有所帮助!

答案 1 :(得分:1)

虽然不清楚计数的来源,甚至可能有错字(75643 != 76543),或者如果您是按行或列运行,请考虑嵌套的sapplyapply两个边距的解决方案:

按行

search <- c(12345, 1234567, 76543, 54432)                                # ADJUSTED TYPO    
mat <- sapply(search, function(s) apply(df1, 1, function(x) s %in% x))   # 1 FOR ROW MARGIN

colnames(mat) <- search
rownames(mat) <- paste0("row", seq(nrow(df1)))

mat
#      12345 1234567 76543 54432
# row1  TRUE   FALSE FALSE FALSE
# row2 FALSE   FALSE FALSE  TRUE
# row3  TRUE    TRUE FALSE FALSE
# row4 FALSE   FALSE  TRUE FALSE

按列

search <- c(12345, 1234567, 76543, 54432)                                # ADJUSTED TYPO
mat <- sapply(search, function(s) apply(df1, 2, function(x) s %in% x))   # 2 FOR COL MARGIN

colnames(mat) <- search
rownames(mat) <- paste0("col", seq(ncol(df1)))

mat
#      12345 1234567 76543 54432
# col1  TRUE    TRUE FALSE FALSE
# col2  TRUE   FALSE  TRUE  TRUE
# col3 FALSE    TRUE FALSE FALSE
# col4  TRUE   FALSE  TRUE  TRUE

Rextester demo