根据值的标准子集数据框或矩阵

时间:2016-05-16 08:06:13

标签: r matrix dataframe subset

假设我有一个矩阵或数据框,我只想要那些大于15且没有85到90之间的值的值

a<-matrix(1:100,nrow = 10,  ncol = 10)
rownames(a) <- LETTERS[1:10]
colnames(a) <- LETTERS[1:10]
   A  B  C  D  E  F  G  H  I   J
A  1 11 21 31 41 51 61 71 81  91
B  2 12 22 32 42 52 62 72 82  92
C  3 13 23 33 43 53 63 73 83  93
D  4 14 24 34 44 54 64 74 84  94
E  5 15 25 35 45 55 65 75 85  95
F  6 16 26 36 46 56 66 76 86  96
G  7 17 27 37 47 57 67 77 87  97
H  8 18 28 38 48 58 68 78 88  98
I  9 19 29 39 49 59 69 79 89  99
J 10 20 30 40 50 60 70 80 90 100

注意:如果您知道在数据框中可以进行此类操作,则可以将其转换为数据框

现在我希望我的结果采用这样的格式,即只保留大于5且小于85的值,并删除所有其他值并替换为空格。 我想要的就像下面

   A  B  C  D  E  F  G  H  I   J
A    11 21 31 41 51 61 71 81  91
B    12 22 32 42 52 62 72 82  92
C    13 23 33 43 53 63 73 83  93
D    14 24 34 44 54 64 74 84  94
E  5 15 25 35 45 55 65 75 85  95
F  6 16 26 36 46 56 66 76     96
G  7 17 27 37 47 57 67 77     97
H  8 18 28 38 48 58 68 78     98
I  9 19 29 39 49 59 69 79     99
J 10 20 30 40 50 60 70 80    100

R中是否有任何类型的功能可以满足我的条件并产生所需的结果。我想根据问题更改代码。我在堆栈流中搜索了它,但没有找到类似的东西。我不想基于行或列进行格式化。 我试过了 一个[A&GT; 5&amp;一个!= C(85:90)] 但这给了我价值并且失去了结构。

1 个答案:

答案 0 :(得分:4)

假设'a'为matrix,我们可以将'a'%in% 86:90或|小于5(a < 5)的值指定为NA。在此,我没有将其分配给'',因为它会将班级从numeric更改为character。此外,分配给NA对以后的处理也很有用。

a[a %in% 86:90 | a<5] <- NA

但是,如果我们需要它''

a[a %in% 86:90 | a<5] <- ""

如果我们使用data.frame

a1 <- as.data.frame(a)
a1[] <- lapply(a1, function(x) replace(x, x %in% 86:90| x <5, ""))
a1
#   A  B  C  D  E  F  G  H  I   J
#A    11 21 31 41 51 61 71 81  91
#B    12 22 32 42 52 62 72 82  92
#C    13 23 33 43 53 63 73 83  93
#D    14 24 34 44 54 64 74 84  94
#E  5 15 25 35 45 55 65 75 85  95
#F  6 16 26 36 46 56 66 76     96
#G  7 17 27 37 47 57 67 77     97
#H  8 18 28 38 48 58 68 78     98
#I  9 19 29 39 49 59 69 79     99
#J 10 20 30 40 50 60 70 80    100

注意:这会将每列的class更改为character

在OP的代码中,a!=c(85:90)将不会按预期工作,因为85:90将循环到'a'的长度,并且比较将在循环值中的相应值之间和'一个'。相反,我们需要%in%使用vector length&gt; 1。