R语言 如何为每个学生申报的专业创建顺序/排名

llew8vvj  于 2023-01-22  发布在  其他
关注(0)|答案(4)|浏览(114)

我有一个数据集,其中包含学生ID和专业名称沿着学期。主要的复杂因素是,如果学生返回到以前的专业,我希望它算作另一个专业

StudID   Major       Term
12345    History     202101
12345    History     202102
12345    Management  202201
12345    History     202202

预期结果

StudID   Major       Term    MajorNumber
12345    History     202101  1
12345    History     202102  1
12345    Management  202201  2
12345    History     202202  3

我唯一尝试过的是拉入每个专业的最早学期,然后根据每个专业的最早学期在StudentID中进行排名,但这意味着最终的“历史”变成了1而不是3

pqwbnv8z

pqwbnv8z1#

data.table::rleid函数就是这样做的,具体来说,它会给所有连续的相同值赋予相同的ID,并且每当有变化时都会递增。
使用数据表,

library(data.table)
your_dt = as.data.table(your_data)
your_dt[, MajorNumber := rleid(Major), by = .(StudID)]
your_dt
#    StudID      Major   Term MajorNumber
# 1:  12345    History 202101           1
# 2:  12345    History 202102           1
# 3:  12345 Management 202201           2
# 4:  12345    History 202202           3

或者使用dplyr

library(dplyr)
your_data %>%
  group_by(StudID) %>%
  mutate(MajorNumber = data.table::rleid(Major)) %>%
  ungroup()
vohkndzv

vohkndzv2#

base R中,使用ave + rle

dat$MajorNumber <-  with(dat, as.integer(ave(Major, StudID, 
  FUN = \(x) with(rle(x), rep(seq_along(values), lengths)))))
dat$MajorNumber
[1] 1 1 2 3
7gcisfzg

7gcisfzg3#

下面是一个dplyr解决方案:

library(dplyr)

df %>% 
  mutate(x = cumsum(Major != lag(Major, default = Major[1]))+1)
StudID      Major   Term x
1  12345    History 202101 1
2  12345    History 202102 1
3  12345 Management 202201 2
4  12345    History 202202 3
mzaanser

mzaanser4#

这可能不是最好的方法,但我尝试了下面的代码

数据

data <- tribble(
~StudID,   ~Major,  ~Term,
12345,    'History',     202101,
12345,    'History' ,    202102,
12345,    'Management',  202201,
12345,    'History',     202202
)

编号

data2 <- data %>% 
mutate(term2=substr(as.character(Term),1,4)) %>% 
group_by(StudID,Major,term2) %>%  slice(1) %>% 
ungroup() %>% 
arrange(StudID,Term) %>% mutate(row=row_number())

data3 <- data %>% full_join(data2 %>% select(-term2), by=c('StudID','Term','Major')) %>% 
fill(row)

输出

相关问题