r - 为R中分类变量的连续观察添加计数器?
问题描述
我有一个数据框,其中一个变量对我的观察结果(ID)和另一个分类变量(类型)进行分组。我在 R 中工作,并试图创建一个新变量来计算 ID 中相同类型的连续观察值(数据是时间序列)。请参阅下面的示例表 - Counter 是我要创建的变量。是否计算 0 并不重要。
dat <- data.frame(id = c(rep("a", 7), rep("b", 4)),
type = c(0, 1, 1, 2, 2, 0, 1, 1, 1, 2, 0),
counter = c(0, 1, 2, 1, 2, 0, 1, 1, 2, 1, 0))
到目前为止,我能够制作计数器,虽然可能不是以最有效的方式,但我正在努力在分组 (ID) 中这样做并有效地在 type = 1 和 type = 2 之间切换。我编写的代码是计数器在下面。关于如何有效地做到这一点的任何想法?谢谢。
dat$counter <- 0
counter <- 0
for(i in 1:nrow(dat)){
if(dat[i,"type"] != 0){
counter <- counter + 1
dat[i,"count"] <- counter
# use to differentiate between 1 and 2?
this_group <- dat[i,"type"]
}
if(dat[i,"type"] == 0){
counter <- 0
}
}
解决方案
对于从 0 开始的每一id
行type
和连续行,使用andtype
创建一个序列。不使用任何软件包:ave
seq_along
transform(dat,
counter = (type > 0) * ave(type, id, type, cumsum(type == 0), FUN = seq_along))
给予:
id type counter
1 a 0 0
2 a 1 1
3 a 1 2
4 a 2 1
5 a 2 2
6 a 0 0
7 a 1 1
8 b 1 1
9 b 1 2
10 b 2 1
11 b 0 0
推荐阅读
- postgresql - Docker-compose.yml 配置问题
- python - TypeError:“NoneType”对象不可使用不和谐 API 和 youtube_dl 调用
- qt - 打包一个 Qt/win32 应用程序以在 microsoft store 上发布
- arrays - 为什么在屏幕上毫无问题地打印输入后我的数据存储不正确?
- python - Python3 virtualenv 安装失败:没有名为“virtualenv.seed.via_app_data”的模块
- python - cookie 字典如何与 session.cookies 兼容
- excel - 在VBA中保存月份名称不是数字的文件
- python - 合并/连接两个数据框并在列中添加数值
- python - 如何使用 Python 将 Google App Engine 连接到外部 Mysql 数据库
- java - maven install - 无法执行目标 org.apache.maven.plugins,编译时出现致命错误