r - 如何根据条件添加具有累进数字的列
问题描述
我正在尝试向我现有的数据集添加一列。数据集包含三列:
Student
(这是具有参与者 ID 的列),Week
(收集数据的一年中的周数),以及Day
(收集数据的工作日数)。
现在,Obs
我尝试创建的新列将包含一个累进数字(从 1 到 n),表示每个学生接受测试的那一周。
我试图group_by
结合使用,rep
但它似乎没有产生我想要的结果:
Week <- c(1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4)
Day <- c(1, 2, 3, 2, 3, 5, 1, 3, 2, 3, 4, 5)
Student <- c("A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C")
fake.db <- data.frame(Student, Week, Day)
library(dplyr)
fake.db %>%
group_by(Student) %>%
mutate(Obs = rep(1:length(Student), each = Week))
# Student Week Day Obs
# <fct> <dbl> <dbl> <int>
# 1 A 1 1 1
# 2 A 1 2 2
# 3 A 1 3 3
# 4 B 2 2 1
# 5 B 2 3 2
# 6 B 2 5 3
# 7 B 3 1 4
# 8 B 3 3 5
# 9 C 4 2 1
#10 C 4 3 2
#11 C 4 4 3
#12 C 4 5 4
我想得到的是不同的。对于数据收集的第一周,1
应该报告,对于在第二周收集数据的学生,2
应该报告,等等:
# Student Week Day Obs
#1 A 1 1 1
#2 A 1 2 1
#3 A 1 3 1
#4 B 2 2 1
#5 B 2 3 1
#6 B 2 5 1
#7 B 3 1 2
#8 B 3 3 2
#9 C 4 2 1
#10 C 4 3 1
#11 C 4 4 1
#12 C 4 5 1
解决方案
一种dplyr
可能是:
fake.db %>%
group_by(Student) %>%
mutate(Obs = cumsum(!duplicated(Week)))
Student Week Day Obs
<fct> <dbl> <dbl> <int>
1 A 1 1 1
2 A 1 2 1
3 A 1 3 1
4 B 2 2 1
5 B 2 3 1
6 B 2 5 1
7 B 3 1 2
8 B 3 3 2
9 C 4 2 1
10 C 4 3 1
11 C 4 4 1
12 C 4 5 1
它按“学生”列分组并计算非重复“周”值的累积总和。
或者:
fake.db %>%
group_by(Student) %>%
mutate(Obs = with(rle(Week), rep(seq_along(lengths), lengths)))
它按“学生”列分组,并在“周”列周围创建一个运行长度类型组 ID。
或者:
fake.db %>%
group_by(Student) %>%
mutate(Obs = dense_rank(Week))
它按“学生”列分组,并对“周”列中的值进行排名。
推荐阅读
- karate - 将 TM4J(Jira 测试管理)Adpavist 与空手道测试集成
- javascript - Javascript然后错误(等待消息)不和谐
- sql-server - 无法连接到 AWS RDS SQL Server
- sql - PostgreSQL:查找班级中超过 1 个科目不及格的学生(分数 < 50)
- c - C 无效的内存访问
- google-chrome - Chrome 扩展:chrome.tabs.create 无法在 body 内容较大时创建 URL 内容
- rest - 如何在 IBM DB2 上通过 REST 连接?
- html - 需要一个解决方案来替换可以从 Web 浏览器使用的 ActiveX\HTML 5
- c - 从文件读取到 C 中的二维数组没有固定大小
- javascript - P5.js 椭圆不跟随 mouseX 和 Y