Matrix不会返回查询的元素,即使我可以确认是否存在满足查询的元素

时间:2018-12-10 15:22:53

标签: r

我是R的新手,所以很抱歉这个问题很傻。我有一个矩阵“ friends”,其中包含一堆整数。我还有一个整数列表“ female_ids”,其中包含一些整数。我想用“ NA”替换“ female_ids”中没有的“ friends”的所有元素。

因此,相关功能似乎是

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 :(得分:1)

问题在于friends不是matrix而是data.frame。如果运行,则问题很明显:

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

输出不是30 x 10矩阵。它不会检查每个元素是否在female_ids向量中。因此,如果您先运行friends <- as.matrix(friends),然后再运行friends[!(friends %in% female_ids)] = NA,它应该可以工作。

答案 1 :(得分:0)

如果您想将friends保留为data.frame,则可以这样做

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

但是我怀疑先转换为矩阵会更有效。

答案 2 :(得分:0)

另一种实现所需目标的优雅方法是使用dplyr包直接操作数据帧,而mutate_all动词恰好满足您的需求:

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

在这种情况下,我认为使用dplyr动词比使用base R的子集语法自然得多。