我有一个矩阵源(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
,请帮我解决这个问题。
答案 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