R中连续数据帧行中特定列值的数量
Number of specific column values in consecutive rows of dataframe in R
你好,我有一个相当大的数据框 (~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
我想计算动作值连续出现的次数(例如 (运行,walk),在上面的示例中为 3。此外,最好按 groupID (所以 2 组 1 和 1 组 2 )
除了逐行迭代之外,还有更好的方法吗?
这是使用 stringi
包
的可能解决方案
Select 你的变量
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"
的出现次数。
您可以在 base
中使用 diff
函数。这是假设您只关心 运行-walk 组合,这就是为什么 rest 被设为 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
你好,我有一个相当大的数据框 (~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
我想计算动作值连续出现的次数(例如 (运行,walk),在上面的示例中为 3。此外,最好按 groupID (所以 2 组 1 和 1 组 2 )
除了逐行迭代之外,还有更好的方法吗?
这是使用 stringi
包
Select 你的变量
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"
的出现次数。
您可以在 base
中使用 diff
函数。这是假设您只关心 运行-walk 组合,这就是为什么 rest 被设为 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