我是R的新手,我正在努力找到一个更好的解决方案来有效地完成这个相当简单的任务。
我有data.frame
M
行100,000
行(以及许多列,其中2列与此问题相关,我称之为M1
, M2
)。我有另一个data.frame
,其中包含约10,000个元素的列V1
对此任务至关重要。我的任务是:
对于V1
中的每个元素,找到它在M2
中的位置并拉出相应的M1
。我能够使用for-loop做到这一点,它非常慢!我已经习惯了Matlab和Perl,这对R来说是永恒的!当然有更好的方法。我很感激任何有价值的建议来完成这项任务......
for (x in c(1:length(V$V1)) {
start[x] = M$M1[M$M2 == V$V1[x]]
}
只有一个元素匹配,因此我可以使用逻辑语句直接获取开始向量中的元素。我怎样才能矢量化这个?
谢谢!
答案 0 :(得分:6)
以下是使用@aix的相同示例的另一种解决方案。
M[match(V$V1, M$M2),]
为了衡量性能,我们可以使用R包rbenchmark
。
library(rbenchmark)
f_ramnath = function() M[match(V$V1, M$M2),]
f_aix = function() merge(V, M, by.x='V1', by.y='M2', sort=F)
f_chase = function() M[M$M2 %in% V$V1,] # modified to return full data frame
benchmark(f_ramnath(), f_aix(), f_chase(), replications = 10000)
test replications elapsed relative
2 f_aix() 10000 12.907 7.068456
3 f_chase() 10000 2.010 1.100767
1 f_ramnath() 10000 1.826 1.000000
答案 1 :(得分:4)
另一种选择是使用%in%
运算符:
> set.seed(1)
> M <- data.frame(M1 = sample(1:20, 15, FALSE), M2 = sample(1:20, 15, FALSE))
> V <- data.frame(V1 = sample(1:20, 10, FALSE))
> M$M1[M$M2 %in% V$V1]
[1] 6 8 11 9 19 1 3 5
答案 2 :(得分:2)
听起来像是在寻找merge
:
> M <- data.frame(M1=c(1,2,3,4,10,3,15), M2=c(15,6,7,8,-1,12,5))
> V <- data.frame(V1=c(-1,12,5,7))
> merge(V, M, by.x='V1', by.y='M2', sort=F)
V1 M1
1 -1 10
2 12 3
3 5 15
4 7 3
如果V$V1
可能包含M$M2
中不存在的值,您可能需要指定all.x=T
。这将使用NA填充缺失值,而不是从结果中省略它们。