[英]Assign the ordered number based on two columns in R
我有一个数据框,包括学生在不同年份的考试参与情况。 这是数据框的一部分。
ID level4 level6 exametime
1 0 1 2015-12-19 15:00:00
1 1 0 2015-06-20 09:00:00
1 0 1 2016-06-19 15:00:00
1 0 1 2017-06-17 15:00:00
2 0 1 2015-12-19 15:00:00
2 1 0 2015-06-20 09:00:00
2 0 1 2016-06-19 15:00:00
2 0 1 2017-06-17 15:00:00
2 0 1 2016-12-17 15:00:00
有两名学生参加了两次考试(level4 和 level6)。 level4 和 level6 是表示学生是否参加考试的二元变量。 我想创建两个变量(order_4 和 order_6),根据考试时间的顺序指示每个学生参加考试的顺序。 最终结果应如下所示:
ID level4 level6 exametime order_4 order_6
1 0 1 2015-12-19 15:00:00 0 1
1 1 0 2015-06-20 09:00:00 1 0
1 0 1 2016-06-19 15:00:00 0 2
1 0 1 2017-06-17 15:00:00 0 3
2 0 1 2015-12-19 15:00:00 0 1
2 1 0 2015-06-20 09:00:00 1 0
2 0 1 2016-06-19 15:00:00 0 2
2 0 1 2017-06-17 15:00:00 0 4
2 0 1 2016-12-17 15:00:00 0 3
谢谢!
我们可以按考试时间arrange
数据,并计算每个ID
列level4
和exametime
level6
值的累积总和。 累积和被替换为 0,其中相应级别列中的值为 0。
library(dplyr)
df %>%
mutate(row = row_number()) %>%
arrange(ID, exametime) %>%
group_by(ID) %>%
mutate(across(starts_with('level'), ~replace(cumsum(.), . == 0, 0), .names = 'order_{col}')) %>%
arrange(row) %>%
ungroup %>%
select(-row)
# ID level4 level6 exametime order_level4 order_level6
# <int> <int> <int> <dttm> <dbl> <dbl>
#1 1 0 1 2015-12-19 15:00:00 0 1
#2 1 1 0 2015-06-20 09:00:00 1 0
#3 1 0 1 2016-06-19 15:00:00 0 2
#4 1 0 1 2017-06-17 15:00:00 0 3
#5 2 0 1 2015-12-19 15:00:00 0 1
#6 2 1 0 2015-06-20 09:00:00 1 0
#7 2 0 1 2016-06-19 15:00:00 0 2
#8 2 0 1 2017-06-17 15:00:00 0 4
#9 2 0 1 2016-12-17 15:00:00 0 3
我创建了一个名为row
的临时列来保持行的原始顺序。
数据
df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), level4 = c(0L,
1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), level6 = c(1L, 0L, 1L, 1L, 1L,
0L, 1L, 1L, 1L), exametime = structure(c(1450537200, 1434790800,
1466348400, 1497711600, 1450537200, 1434790800, 1466348400, 1497711600,
1481986800), class = c("POSIXct", "POSIXt"), tzone = "UTC")),
row.names = c(NA, -9L), class = "data.frame")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.