[英]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.