在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$a
和df$b
之间观察到的变化次数。
因为我对一些身份证号码感兴趣而且我做了
summary <- as.data.frame(table(df$id))
id n_id
2 1234758
3 1234759
1 1234760
然后我写了这个来计算a和b为每个id更改的次数(df
和summary
都按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万条这样的线。
答案 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)