如何使用没有循环的向量中的条件从矩阵中过滤一组值?

时间:2014-06-26 04:34:06

标签: r matrix

我有一个矩阵源(A),第一列是键,第二列是每个键的值。

__0_1                    22034
__1000000000000_1        34310
__1000000000000_2        38608
__1000000000_1           18829
__1000_1                 38674
__11_november_1          21566
__11_plus_1              35908
__12_1                   25784
__14_july_1              28671
__15_may_organization_1  36358

向量B是需要在矩阵A上赋值的键的子集。 B:

__14_july_1
__1000000000_1
_15_may_organization_1

这是我从矩阵A中找到B值的代码:

for (i in 1:length(B)){
 rlst<-A[A[,1]==B[i],2];
}

它适用于A&amp; B小。但是我的真实数据非常大,而且循环让我失去了很多时间 我尝试了一些命令,如%in%,subset。但它不适用于我的问题。 如果没有for,请帮我解决这个问题。

3 个答案:

答案 0 :(得分:2)

我假设您只希望B的每个值都匹配一个匹配。以下是您的示例数据集

A<-data.frame(
    V1 = c("__0_1", "__1000000000000_1", "__1000000000000_2", 
    "__1000000000_1", "__1000_1", "__11_november_1", "__11_plus_1", 
    "__12_1", "__14_july_1", "__15_may_organization_1"), 
    V2 = c(22034L, 
    34310L, 38608L, 18829L, 38674L, 21566L, 35908L, 25784L, 28671L, 
    36358L)
)
B<-c("__14_july_1", "__15_may_organization_1", "__1000000000_1")

(注意我实际上切换了B中两个值的位置。)

您可以通过两种方式提取所需的数据

A[A[,1] %in% B, ]
#                         V1    V2
# 4           __1000000000_1 18829
# 9              __14_july_1 28671
# 10 __15_may_organization_1 36358

A[match(B,A[,1]),]
#                         V1    V2
# 9              __14_july_1 28671
# 10 __15_may_organization_1 36358
# 4           __1000000000_1 18829

请注意,第一种方法保留A中行的顺序,而第二种方法按B的顺序返回行,这似乎与您的循环最接近。

答案 1 :(得分:1)

使用data.table包:

require(data.table)
A<-data.frame(
     V1 = c("__0_1", "__1000000000000_1", "__1000000000000_2", 
            "__1000000000_1", "__1000_1", "__11_november_1", "__11_plus_1", 
            "__12_1", "__14_july_1", "__15_may_organization_1"), 
     V2 = c(22034L, 
            34310L, 38608L, 18829L, 38674L, 21566L, 35908L, 25784L, 28671L, 
            36358L)
 )
B<-c("__14_july_1", "__15_may_organization_1", "__1000000000_1")
A <- data.table(A)
setkey(A,V1)
A[B]
                        V1    V2
1:             __14_july_1 28671
2: __15_may_organization_1 36358
3:          __1000000000_1 18829

答案 2 :(得分:0)

library(dplyr)
left_join(data.frame(V1=B), A)
#Joining by: "V1"
#                    V1    V2
#1             __14_july_1 28671
#2 __15_may_organization_1 36358
#3          __1000000000_1 18829