好的,我有一个带有某些标识符的值矩阵,例如:
A 2
B 3
C 4
D 5
E 6
F 7
G 8
我想根据标识符列表(" B"," D"," E&#)提取这些值的子集(使用R) 34;)例如,所以我会得到以下输出:
B 3
D 5
E 6
我确定有一种简单的方法可以做到这一点(某种应用?)但我似乎无法弄明白。有任何想法吗?谢谢!
答案 0 :(得分:1)
如果字母是行名,那么你可以使用它:
m <- matrix(2:8, dimnames = list(LETTERS[1:7], NULL))
m[c("B","D","E"),]
# B D E
# 3 5 6
请注意:m[c("B","D","E"),]
和m[rownames(m) %in% c("B","D","E"),]
之间存在微妙但非常重要的区别。两者都返回相同的行,但 不一定是相同的顺序 。
前者使用字符向量c("B","D","E")
作为m
的索引。因此,行将按字符向量的顺序返回。例如:
# result depends on order in c(...)
m[c("B","D","E"),]
# B D E
# 3 5 6
m[c("E","D","B"),]
# E D B
# 6 5 3
第二种方法使用%in%
创建一个长度= nrow(m)的逻辑向量。对于每个元素,如果T
中存在行名,则该元素为c("B","D","E")
,否则为F
。使用逻辑向量进行索引将按原始顺序返回行:
# result does NOT depend on order in c(...)
m[rownames(m) %in% c("B","D","E"),]
# B D E
# 3 5 6
m[rownames(m) %in% c("E","D","B"),]
# B D E
# 3 5 6
这可能超出你想知道的......
答案 1 :(得分:0)
你的矩阵:
> m <- matrix(2:8, dimnames = list(LETTERS[1:7]))
您可以使用%in%
过滤掉所需的行。如果原始矩阵只有一列,则使用drop = FALSE
将保留矩阵结构。否则它将被转换为命名向量。
> m[rownames(m) %in% c("B", "D", "E"), , drop = FALSE]
# [,1]
# B 3
# D 5
# E 6