提取数据子集

时间:2014-08-14 19:44:42

标签: r

好的,我有一个带有某些标识符的值矩阵,例如:

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

我确定有一种简单的方法可以做到这一点(某种应用?)但我似乎无法弄明白。有任何想法吗?谢谢!

2 个答案:

答案 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