R中连续数据帧行中的特定列值数

时间:2015-03-26 14:41:59

标签: r count

您好我有一个非常大的数据帧(~20k),类似于

id | GroupID | action
1 | 1 | run
2 | 1 | walk
3 | 1 | rest
4 | 1 | run
5 | 1 | walk
6 | 2 | run
7 | 2 | walk

我想计算连续出现的动作值的数量(例如(run,walk),在上面的示例中为3。同样,最好按groupID分组(因此2对于组1和1组为2组)

除了逐行迭代之外,还有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

这是使用stringi

的可能解决方案

选择你的变种

vars <- toString(c("run", "walk"))

然后

library(stringi)
aggregate(action ~ GroupID, df, function(x) stri_count_fixed(toString(x), vars))
#   GroupID action
# 1       1      2
# 2       2      1

或类似地,结合data.table

library(data.table)
setDT(df)[, stri_count_fixed(toString(action), vars), by = GroupID]
#    GroupID V1
# 1:       1  2
# 2:       2  1

基本上我们正在将action转换为由,分隔的一个长字符串,并计算每个组中"run, walk"的出现次数。

答案 1 :(得分:1)

您可以使用diff中的base功能。这假设您只关心跑步行走组合,这就是为什么休息成为NA值的原因。如果您的实际data.frame中出现错误,请发表评论,以便我可以调整我的答案或将其删除。

> df<-data.frame(id=seq(1,7,1),
               group=c(1,1,1,1,1,2,2),
               action=c('run','walk','rest','run','walk','run','walk'))
> df$value<-ifelse(df$action=='rest',NA,
                  ifelse(df$action=='run',1,2)

> df
  id group action value
1  1     1    run     1
2  2     1   walk     2
3  3     1   rest    NA
4  4     1    run     1
5  5     1   walk     2
6  6     2    run     1
7  7     2   walk     2

> setNames(aggregate(df$value,by=list(df$group),function(x) length(which(diff(x)==1))),c('group','run_walk'))
  group run_walk
1     1        2
2     2        1