簡體   English   中英

根據 R 中的兩列分配有序數

[英]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數據,並計算每個IDlevel4exametime 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM