首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中连续数据行中特定列值的数目

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

Stack Overflow用户
提问于 2015-03-26 14:41:59
回答 2查看 339关注 0票数 1

你好,我有一张相当大的数据(~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

我希望计数连续出现的操作值的次数(例如,运行、行走),在上面的示例中这将是3。另外,最好按groupID分组(第1组的SO2和第2组的第1组)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-26 14:58:35

下面是使用stringi包的一个可能的解决方案

选择您的vars

代码语言:javascript
复制
vars <- toString(c("run", "walk"))

然后

代码语言:javascript
复制
library(stringi)
aggregate(action ~ GroupID, df, function(x) stri_count_fixed(toString(x), vars))
#   GroupID action
# 1       1      2
# 2       2      1

或者类似地,与data.table包组合在一起

代码语言:javascript
复制
library(data.table)
setDT(df)[, stri_count_fixed(toString(action), vars), by = GroupID]
#    GroupID V1
# 1:       1  2
# 2:       2  1

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

票数 5
EN

Stack Overflow用户

发布于 2015-03-26 15:06:54

您可以在diff中使用base函数。这是假设你只关心跑步组合,这就是为什么休息被赋予安娜的价值。如果在实际的data.frame中出现错误,请留下评论,这样我就可以调整我的答案或者删除它。

代码语言:javascript
复制
> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29281382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档