Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 比较向量_Optimization_R_Vector - Fatal编程技术网

Optimization 比较向量

Optimization 比较向量,optimization,r,vector,Optimization,R,Vector,我是R的新手,正在努力找到一个更好的解决方案来有效地完成这个相当简单的任务 我有一个data.frameM和100000行(以及许多列,其中两列与此问题相关,我将其称为M1,M2)。我还有另一个数据。框架,其中包含大约10000个元素的列V1,对这项任务至关重要。我的任务是: 对于V1中的每个元素,找出它在M2中的位置,并拉出相应的M1。我可以用for循环来做这件事,而且速度非常慢!我习惯了Matlab和Perl,这在R中是永远的!当然还有更好的办法。如果您能为完成这项任务提供任何有价值的建议,

我是R的新手,正在努力找到一个更好的解决方案来有效地完成这个相当简单的任务

我有一个
data.frame
M
100000
行(以及许多列,其中两列与此问题相关,我将其称为
M1
M2
)。我还有另一个
数据。框架
,其中包含大约10000个元素的列
V1
,对这项任务至关重要。我的任务是:

对于
V1
中的每个元素,找出它在
M2
中的位置,并拉出相应的
M1
。我可以用for循环来做这件事,而且速度非常慢!我习惯了Matlab和Perl,这在R中是永远的!当然还有更好的办法。如果您能为完成这项任务提供任何有价值的建议,我将不胜感激

for (x in c(1:length(V$V1)) {  
    start[x] = M$M1[M$M2 == V$V1[x]]  
}  
只有1个元素将匹配,因此我可以使用逻辑语句直接获取起始向量中的元素。如何将其矢量化


谢谢大家!

听起来你在寻找
合并

> 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
>mv合并(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
。这将使用NAs来填充缺少的值,而不是从结果中忽略它们。

听起来像是在寻找
合并

> 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
>mv合并(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
。这将使用NAs填充缺少的值,而不是从结果中忽略它们。

另一个选项是使用%中的
%运算符:

> 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
>设置种子(1)
>M V M$M1[M$M2%在%V$V1中]
[1]  6  8 11  9 19  1  3  5

另一个选项是使用%
运算符中的
%

> 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
>设置种子(1)
>M V M$M1[M$M2%在%V$V1中]
[1]  6  8 11  9 19  1  3  5

下面是另一个解决方案,它使用了@aix的相同示例

M[匹配(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

下面是另一个使用@aix相同示例的解决方案

M[匹配(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

%
中的
%应该以与
匹配
类似的方式执行,因为它只是
匹配
@chase的包装。我尝试了您的解决方案,并希望%
中的
%执行与
匹配
相同的操作。但是当我运行
基准测试时,我惊讶地发现,`%in%慢了10%。不知道是什么原因造成的。@Ramnath-谢谢你更新测试。这可能是
nomatch
参数之间的差异吗?默认值为
nomatch=NA_integer.
%in%
使用
nomatch=0
@Chase。我想这可能就是原因。我使用
match
将解决方案修改为使用
nomatch=0
,性能与%
中的
%类似。另外,我对您生成的数据集运行了基准测试,发现
匹配
解决方案比%
中的
%慢10%。因此,这里可能也发生了一些其他的事情。在模拟OP上,数据计时是不同的:
N
%in%
应该以类似于
match
的方式执行,因为它只是
match
@chase的包装。我尝试了您的解决方案,并希望%
中的
%执行与
匹配
相同的操作。但是当我运行
基准测试时,我惊讶地发现,`%in%慢了10%。不知道是什么原因造成的。@Ramnath-谢谢你更新测试。这可能是
nomatch
参数之间的差异吗?默认值为
nomatch=NA_integer.
%in%
使用
nomatch=0
@Chase。我想这可能就是原因。我使用
match
将解决方案修改为使用
nomatch=0
,性能与%
中的
%类似。另外,我对您生成的数据集运行了基准测试,发现
匹配
解决方案比%
中的
%慢10%。所以这里可能还有其他的事情发生。在模拟操作中,数据计时是不同的:
N