Есть ли способ перебрать матрицу / df в R, чтобы создать матрицу смежности? - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь перебрать 53 строки в data.frame и создать матрицу смежности с результатами.Однако мои усилия по-прежнему зашли в тупик из-за того, что цикл не будет работать правильно.

Я попытался создать совпадения, а также применить многочисленные функции count(), но безуспешно.

MRE: (По правде говоря, данные намного больше, поэтому мой уникальный поиск на самом деле состоит из 217 тыс. Элементов)

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)

Я хотел бы пройтись по каждой строке и обновить новую матрицу / 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 ]

1 голос
/ 26 июня 2019

Хотя неясно, как рассчитываются ваши значения, поскольку возможна даже опечатка (75643 != 76543) или если вы работаете по строкам или столбцам, рассмотрите решение для вложенных sapply и apply для обоих полей:

По строке

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

1 голос
/ 26 июня 2019

Я думаю, вы должны проверить 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

Надеюсь, это поможет!

...