Матрица не возвращает запрашиваемые элементы, хотя я могу подтвердить, что есть элементы, которые удовлетворяют запросу - PullRequest
0 голосов
/ 10 декабря 2018

Я новичок в R, поэтому прошу прощения, если этот вопрос глупый.У меня есть матрица «друзья», в которой содержится куча целых чисел.У меня также есть список целых чисел "female_ids", который содержит некоторые целые числа.Я хочу заменить все элементы "friends", кроме "female_ids", на "NA".

Итак, соответствующая функция выглядит как

friends[!(friends %in% female_ids)] = NA

Но это заменяет все на NA!Озадаченный, я проверил friends[30, 10] %in% female_ids, что оказалось True.Затем я проверил friends[friends %in% female_ids], который оказался пустым.Кроме того, я проверил friends[friends == 28] (есть несколько элементов, равных 28), и это оказалось непустым.

Мой вопрос: я упускаю что-то очень очевидное?У меня есть хотя бы один элемент (30, 10), который определенно указан в female_ids.Но, тем не менее, когда я запрашиваю всю матрицу, он думает, что ничего нет в female_ids.

Я рад предоставить любую дополнительную информацию, которая будет полезна.Заранее благодарим за помощь!

Вот соответствующие данные.

> dput(friends)
structure(list(MF1 = c(33L, 34L, 72L, 3L, 27L, 94L, 49L, 16L, 
19L, 33L, 43L, 94L, 73L, 47L, 94L, 27L, 73L, 23L, 73L, 63L, 33L, 
43L, 86L, 16L, 4L, 3L, 33L, 76L, 72L, 86L), MF2 = c(63L, 52L, 
54L, 19L, 19L, 73L, 63L, 72L, 94L, 86L, 64L, 83L, 99L, 16L, 99L, 
73L, 82L, 61L, 94L, 16L, 94L, 16L, 61L, 16L, 82L, 82L, 4L, 76L, 
23L, 47L), MF3 = c(27L, 19L, 82L, 64L, 72L, 47L, 47L, 52L, 76L, 
23L, 34L, 4L, 63L, 52L, 34L, 72L, 3L, 73L, 16L, 73L, 86L, 3L, 
27L, 64L, 3L, 49L, 57L, 54L, 63L, 23L), MF4 = c(23L, 72L, 52L, 
34L, 33L, 61L, 73L, 3L, 47L, 52L, 57L, 76L, 23L, 4L, 27L, 82L, 
83L, 64L, 3L, 73L, 27L, 33L, 83L, 82L, 16L, 47L, 3L, 57L, 4L, 
94L), MF5 = c(16L, 57L, 57L, 82L, 99L, 64L, 4L, 34L, 73L, 3L, 
23L, 27L, 82L, 19L, 3L, 83L, 61L, 47L, 27L, 47L, 72L, 86L, 83L, 
19L, 64L, 73L, 94L, 27L, 83L, 19L), FF1 = c(81L, 21L, 50L, 45L, 
81L, 36L, 90L, 42L, 21L, 2L, 7L, 45L, 42L, 59L, 14L, 75L, 46L, 
69L, 28L, 81L, 45L, 17L, 56L, 65L, 50L, 50L, 2L, 69L, 69L, 46L
), FF2 = c(11L, 42L, 65L, 14L, 81L, 81L, 42L, 14L, 28L, 7L, 56L, 
7L, 90L, 28L, 11L, 65L, 65L, 90L, 45L, 67L, 91L, 67L, 14L, 56L, 
65L, 67L, 14L, 46L, 78L, 45L), FF3 = c(62L, 7L, 62L, 56L, 69L, 
17L, 7L, 28L, 2L, 5L, 46L, 56L, 59L, 14L, 2L, 56L, 56L, 14L, 
21L, 36L, 78L, 62L, 11L, 59L, 62L, 45L, 70L, 17L, 14L, 56L), 
    FF4 = c(91L, 67L, 42L, 50L, 45L, 56L, 2L, 11L, 7L, 14L, 17L, 
    17L, 62L, 50L, 62L, 2L, 78L, 75L, 91L, 11L, 28L, 69L, 70L, 
    78L, 45L, 5L, 56L, 2L, 42L, 70L), FF5 = c(45L, 75L, 70L, 
    78L, 36L, 42L, 21L, 7L, 36L, 11L, 28L, 14L, 36L, 36L, 28L, 
    14L, 67L, 56L, 70L, 28L, 46L, 81L, 45L, 90L, 42L, 21L, 67L, 
    90L, 11L, 28L)), class = "data.frame", row.names = c(NA, 
-30L))

> dput(female_ids)
c(42L, 56L, 14L, 75L, 11L, 28L, 78L, 65L, 81L, 36L, 90L, 62L, 
50L, 69L, 7L)

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Если вы хотите сохранить friends как data.frame, вы можете сделать

friends[apply(friends, 2, function(x) !(x %in% female_ids))] = NA

Но я подозреваю, что сначала преобразование в матрицу может быть более эффективным.

0 голосов
/ 10 декабря 2018

Еще один элегантный способ добиться того, чего вы хотите, - это использовать пакет dplyr для непосредственной манипуляции с фреймом данных, а глагол mutate_all делает именно то, что вы хотите:

library(dplyr)
friends <- friends %>% mutate_all(function(x){ ifelse(x %in% female_ids, x, NA) })

Я думаю, используя dplyr Глаголы могут быть намного более естественными, чем использование синтаксиса подстановки базового R в подобных ситуациях.

0 голосов
/ 10 декабря 2018

Проблема в том, что friends - это не matrix, а data.frame.Проблема очевидна, если вы запустите:

friends %in% female_ids
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Вывод не является матрицей 30 на 10.Он не проверяет для каждого элемента, находится ли он в векторе female_ids.Так что если вы сначала запустите friends <- as.matrix(friends), а затем friends[!(friends %in% female_ids)] = NA, это должно сработать.

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