Как извлечь повторяющиеся строки в матрице - PullRequest
0 голосов
/ 20 февраля 2019

IRI имеет эту матрицу

> Y
>      [,1] [,2] [,3] [,4]
[1,] "0"  "2"  "9"  "5" 
[2,] "4"  "7"  "7"  "3" 
[3,] "1"  "5"  "7"  "9" 
[4,] "7"  "8"  "7"  "4" 
[5,] "7"  "8"  "7"  "4" 
[6,] "1"  "1"  "7"  "2" 
[7,] "7"  "8"  "7"  "4" 
...

Из этой матрицы я хочу получить все повторяющиеся строки, которые повторяются 1 раз, 2 раза, 3 раза и так далее.

Так, например,

"7" "8" "7" "4"

встречается 3 раза в Y. Как мне найти вседругие случаи?

Таким образом, выходные данные должны быть:

Вернуть все строки, которые встречаются 2 раза в Y.

Вернуть все строки, которые встречаются 3 разав Y.

Вернуть все строки, которые встречаются в Y и более 4 раз.

Я пытался решить эту проблему с помощью

> duplicate

команда, но этого недостаточно.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Используя тестовую матрицу Y в примечании в конце, используйте aggregate, чтобы создать фрейм данных ag, строки которого являются уникальными строками Y с последующим подсчетом того, сколько раз они встречаются.

ag <- aggregate(cbind(count = apply(Y, 1, toString)) ~ ., as.data.frame(Y), 
  FUN = length)

nc <- ncol(Y)
subset(ag, count == 2, select = -count) # shows rows which occur twice

split(ag[1:nc], ag$count) # splits unique rows into those that occur once, twice, etc.

Примечание

Y <- matrix(c(0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 
0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 
0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 
0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1), 25, 4)
0 голосов
/ 20 февраля 2019

Вот простое решение, основанное на объединении строк вашей матрицы в строку, а затем в таблице частоты, с которой появляются строки.

Сначала мы сгенерируем несколько простых фальшивых данных.Я генерирую случайные нули и единицы, чтобы гарантировать, что будет много дубликатов:

Y <- matrix(rbinom(100, 1, .5), ncol = 4)
head(Y)
#>      [,1] [,2] [,3] [,4]
#> [1,]    0    0    0    1
#> [2,]    0    0    0    0
#> [3,]    0    0    0    0
#> [4,]    0    0    0    1
#> [5,]    0    1    1    0
#> [6,]    0    0    1    0

# I collapse all the values in each row into a string, so c(0,1,0,1) becomes "0101"
row.ids <- apply(Y, 1, paste, collapse = "")
# Now using table() I can get the frequency with which each pattern appears
row.freqs <- table(row.ids)

# All triply replicated rows
Y[row.ids %in% names(row.freqs[row.freqs==3]),]
#>      [,1] [,2] [,3] [,4]
#> [1,]    0    0    0    1
#> [2,]    0    0    0    1
#> [3,]    0    1    1    0
#> [4,]    0    0    0    1
#> [5,]    0    1    1    0
#> [6,]    0    1    1    0

# All quadruply replicated rows
Y[row.ids %in% names(row.freqs[row.freqs==4]),]
#>       [,1] [,2] [,3] [,4]
#>  [1,]    0    0    0    0
#>  [2,]    0    0    0    0
#>  [3,]    0    0    1    0
#>  [4,]    0    0    1    0
#>  [5,]    0    0    0    0
#>  [6,]    0    0    1    0
#>  [7,]    0    1    1    1
#>  [8,]    0    1    1    1
#>  [9,]    0    1    1    1
#> [10,]    0    0    0    0
#> [11,]    0    1    1    1
#> [12,]    0    0    1    0

Создано в 2019-02-20 пакетом Представить (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...