计算数据帧中的子集R-way

时间:2016-04-25 10:04:59

标签: r vectorization

在R中,我有一个这种形式的数据框df

a b id
1 2 1234758
1 1 1234758
3 5 1234759
5 5 1234759
5 5 1234759
2 2 1234760

我想计算每个id值在df$adf$b之间观察到的变化次数。

因为我对一些身份证号码感兴趣而且我做了

summary <- as.data.frame(table(df$id))
id n_id
2  1234758
3  1234759
1  1234760

然后我写了这个来计算a和b为每个id更改的次数(dfsummary都按id排序)

summary$jumps <- 0
k <- 1
for(i in 1:nrow(summary)) {
n <- summary$n_id[i]
for(j in k:k+n-1) if(df$a[j] != df$b[j]) summary$jumps[i] <- summary$jumps[i] + 1 
  k <- k + n 
}

查找df中每个条目出现的每个条目的时间,检查a和b并更新摘要中的相应条目。这可以按预期工作,但对我来说看起来很慢。

我对R来说相当新,我们在R中做一个更有效的方法是什么?你会如何矢量化这段代码?数据框有大约3000万条这样的线。

2 个答案:

答案 0 :(得分:4)

如果我正确理解您的问题,您可以使用data.table以相当直接的方式解决它;

library(data.table)

dt = setDT(df)                    # Create a data table
dt[,list(jumps=sum(a!=b)),by=id]  # Sum rows where a!=b grouped by id

#         id jumps
# 1: 1234758     1
# 2: 1234759     1
# 3: 1234760     0

答案 1 :(得分:1)

我们可以使用aggregate

中的base R
aggregate(cbind(jumps = a!=b)~id, df1, FUN=sum)