在r中更快的循环

时间:2016-01-28 19:10:55

标签: r loops

我有两个数据框Test and User。

测试有100 000行,而用户有1 400 000行。我想从用户数据框中提取特定向量,并将其与测试数据框合并。例如,我希望用户测试中的每行收入和猫。测试中的行是重复元素,我想要用户文件中的任何一个值。我想保留测试文件而不删除重复项。

Ex的名字A收入是100,Cat是M& L.由于M首先发生,我需要M。

> Test  
Name Income  Cat    
A  
B  
C  
D  
...  

User Cat Income  
A    M     100  
B    M     320  
C    U     400  
D    L     900  
A    L     100  
..  

我用过循环但需要很多时间。我不想使用合并功能。

for (i in 1:nrow(Test)
{
{ Test[i,"Cat"]<-User[which(User$Name==Test[i,"Name"]),"Cat"][1]}
 { Test[i,"Income"]<-User[which(User$Name==Test[i,"Name"]),"Income"][1]}}

我也使用了合并,但测试文件的总计数超过了100k行。它附加了额外的元素。

我希望通过避免循环和合并来实现更快捷的方法。有人可以建议任何适用的家庭功能。

2 个答案:

答案 0 :(得分:1)

您可以使用1*4 == 2*2查找第一个匹配的行(然后对其进行矢量化):

match

答案 1 :(得分:0)

使用dplyr包可以执行以下操作:

library(dplyr)
df %>% group_by(Name) %>% slice(1)

对于你的例子,你得到:

原始数据框:

df
  Name Cat Income
1    A   M    100
2    B   M    320
3    C   U    400
4    D   L    900
5    A   L    100

首次选择:

df %>% group_by(Name) %>% slice(1)
Source: local data frame [4 x 3]
Groups: Name [4]

   Name   Cat Income
  (chr) (chr)  (int)
1     A     M    100
2     B     M    320
3     C     U    400
4     D     L    900