Как мне привести в порядок данные о зачислении учащихся на семестр? - PullRequest
1 голос
/ 27 марта 2019

У меня есть набор данных, который в настоящее время содержит информацию о студентах по семестрам (т.е. 201610, 201620, 201630, 201640, 201710 и т. Д.) С суффиксом 10 = осень, 20 = зима, 30 = весна и 40 = лето , Не все термины обязательно указаны для каждого студента.

То, что я хотел бы сделать, - это определить первый семестр, в который был зачислен студент, предположительно осень, как T1, а последующие термины как T2, T3 и т. Д. Так как некоторые студенты могут брать зимний летний семестр, я бы хотел бы идентифицировать их как T1_Winter, T2_Summer и т. д.

Я смог выделить отдельные термины, на которые записался студент, и смог определить первый, промежуточный и последний термины как 1, 2, 3 и т. Д. Однако я не могу управлять обернуть голову, как определить осень и весну как 1, 2, 3, 4 и промежуточные термины, зима и лето, и 1,5, 2,5, 3,5, 4,5 и т. д.

# Create the sample dataset
data <- data.frame(
  ID = c(1, 1, 1, 2, 2, 2, 2),
  RegTerm = c(201810, 201820, 201830, 201910, 201930, 201940, 202010))
)

# Isolate student IDs and terms
stdTerm <- subset(data, select = c("ID","RegTerm"))

# Sort according to ID and RegTerm
stdTerm <- stdTerm[
  with(stdTerm, order(ID, RegTerm)),
  ]

# Remove duplicate combinations of ID and term
y <- stdTerm[!duplicated(stdTerm[c(1,2)]),]

# Create an index to identify the term number
# for which a student enrolled
library(dplyr)
z <- y %>% 
  arrange(ID, RegTerm) %>% 
  group_by(ID) %>% 
  mutate(StdTermIndex = seq(n()))

Прямо сейчас, это идентифицирует последовательность всех терминов для студента как 1, 2, 3 и т. Д., Но не зима и лето как промежуточные термины. То есть, если студент зачислен осенью и зимой, зима будет отображаться как 2, а весна будет отображаться как 3.

В предоставленных примерах данных я хотел бы, чтобы идентификатор студента 1 отображал 201810 как 1, 201820 как 1,5 и 201830 как 2 и т. Д. Любые предложения или предыдущий код, на которые я мог бы сослаться, обернутся вокруг того, как я могу кодировать промежуточные семестры?

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Итак, чтобы сделать это в вашем примере, я создал переменную дескриптора, которая сообщает мне, является ли RegTerm четным или нечетным.

Причина проста, нечетная RegTerm означает, что это обычный термин, в то время как четные будут зимними или летними.

library(dplyr)
data <- data.frame(
  ID = c(1, 1, 1, 2, 2, 2, 2),
  RegTerm = c(201810, 201820, 201830, 201910, 201930, 201940, 202010)
  )

dat <- data %>%
  mutate(term = str_extract(RegTerm, '(?<=\\d{4})\\d{1}(?=0)'),
         term = as.numeric(term) %% 2) %>%
  group_by(ID) %>%
  mutate(numTerm = cumsum(term),
         numTerm = ifelse(term == 0, numTerm + 0.5, numTerm))

Первый мутат извлекает 5-ю цифру в столбце RegTerm и получает остаток от деления на 2. Если он равен 1, это означает, что это обычный термин, в противном случае это будет либо лето, либо зима.

Далее я беру совокупную сумму этой переменной, которая даст вам, в котором RegTerm студент. Затем для каждого term == 0 я добавляю к numTerm 0,5, чтобы учесть зимние и летние условия.

# A tibble: 7 x 4
# Groups:   ID [2]
     ID RegTerm  term numTerm
  <dbl>   <dbl> <dbl>   <dbl>
1     1  201810     1     1  
2     1  201820     0     1.5
3     1  201830     1     2  
4     2  201910     1     1  
5     2  201930     1     2  
6     2  201940     0     2.5
7     2  202010     1     3  

Таким образом, если есть студент, начинающий с зимнего семестра, numTerm будет присвоено значение 0.5, имеющее numTerm = 1 только тогда, когда он достигнет обычного семестра (term == 1)

0 голосов
/ 28 марта 2019

Я думаю, что хороший способ сделать это - разделить столбец RegTerm на year и suffix, а затем применить некоторую формулу условия, как только вы разделите значения.

Приведенный ниже код делает это, мы просто должны применить его ко всему столбцу и выполнить некоторые настройки.

paste(strsplit(as.character(201810), "")[[1]][1:4], collapse = ""))
# "2018"
paste(strsplit(as.character(201810), "")[[1]][5:6], collapse = ""))
# "10"

Таким образом, чтобы сделать это для фрейма данных, вы хотите использовать что-то вроде lapply, а затем отменить список результатов и добавить новый столбец. После этого вы можете изменить значения на числовые, а затем использовать некоторые условные операторы в функции mutate для установки промежуточных значений и т. Д.

z$year <- unlist(lapply(z$RegTerm, function(x) paste(strsplit(as.character(x), "")[[1]][1:4], collapse = "")))
z$suf <- unlist(lapply(z$RegTerm, function(x) paste(strsplit(as.character(x), "")[[1]][5:6], collapse = "")))

Это выглядит немного некрасиво, но все, что он делает, это разделяет RegTerm, затем выбирает первые 4 или последние 2 символа для года и suf соответственно, затем сворачивает (используя collapse = "" в paste) их в одну строку. Мы lapply переходим к целому столбцу, затем выводим его, чтобы сделать вектор.

Я бы порекомендовал понять первые две строки кода в этом ответе, и тогда он станет очевидным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...