Тест на включение набора и одновременную обработку данных в tidyverse

#r #logic #tidyverse #sequence #dplyr

#r #Логические #аккуратная вселенная #последовательность #dplyr

Вопрос:

У меня почти есть то, что мне нужно. Мне нужна помощь с последней деталью! Набор данных создается следующим образом:

 stu_vec <- c("A","B","C","D","E","F","G","H","I","J")
college_vec <- c("ATC","CCTC","DTC","FDTC","GTC","NETC", "USC", "Clemson", "Winthrop", "Allen")
sctcs <- c("ATC","CCTC","DTC","FDTC","GTC","NETC")
Student <- sample (stu_vec, size=100,replace=T, prob=c(.08,0.09,0.06,.07,.12,.10,.07,.05,.11,.05))
College <- sample(college_vec, size=100, replace=T,prob=c(.08,.07,.13,.12,.11,.06,.05,.08,.02,.08))

test.dat1 <- as.data.frame(cbind(Student, College))
 

Я использую следующий код, чтобы создать то, что мне нужно

 library(dplyr)

set.seed(29)
test.dat2 <- test.dat1 %>% 
  group_by(Student, .drop=F) %>% #group by student
  mutate(semester= sequence(n())) %>% #set semester sequence
  summarise(home_school= College[min(which(College %in% sctcs))], # Find first college in sctcs
            seq_home=min(which(College %in% sctcs)), # add column of sequence values
            new_school= if_else(n_distinct(College) > 1, 
            first(College[!(College %in% sctcs) amp; semester > seq_home]), last(College))) #new_school should be the first non-sctcs school after the sctcs school is found or the last school for that student. 
 

он выдает следующую таблицу

введите описание изображения здесь

Я хочу, чтобы NA были заполнены последним колледжем для этого студента. Я не знаю, как избавиться от АН. Если вы знаете более простой способ создать то же самое, пожалуйста, поделитесь знаниями.

Комментарии:

1. Не используйте as.data.frame(cbind(Student, College)) , вместо этого используйте data.frame(Student, College) . Это меньше ввода и позволяет избежать проблемы, которая cbind создаст матрицу, преобразуя любые числа, которые вам нужны character , потому что матрицы могут иметь только один класс.

2. Что касается заполнения NA полей: ... %>% group_by(student) %>% tdiyr::fill(new_school) .

3. Спасибо за ваш отзыв, но использование tidry::fill(new_school) отбросило бы следующий шаг, который заключается в подсчете количества студентов, переведенных из колледжей sctcs.

4. Тогда, наверное, я не понимаю. Может быть, вы хотите заменить last(College) на last(College[!is.na(College)]) , чтобы получить последний не пропущенный колледж в вашем ifelse ?

5. последняя часть if_else инструкции не работает, и я не знаю почему.

Ответ №1:

Это должно сделать это:

 test.dat2 <- test.dat1 |> 
  mutate(semester= sequence(n())) |>
  arrange(Student, semester) |> # find this a more intuitive order
  group_by(Student, .drop=F) |>
  # Additional mutate step for clarity amp; simplicity
  mutate(seq_home = min(which(College %in% sctcs))) |>
  summarise(home_school = College[seq_home],
            new_school = 
              College[
                coalesce(
                  first(which(!(College %in% sctcs) amp; semester > seq_home)),
                  seq_home,
                  length(College))
                  ]
            )
 

Мы индексируем College с coalesce() помощью , которая возвращает первое не пропущенное значение из его аргументов. Первоначально мы ищем первый колледж, не относящийся к sctcs, который они посещали после посещения home_school . Если это возвращается NA (т. Е. Такого колледжа нет), мы просто возвращаемся seq_home , чтобы получить последний колледж sctcs, который они посещали. Если это возвращает NA (как это было бы в случае, если бы они никогда не посещали какие-либо колледжи sctcs), мы возвращаем length(College) , что, конечно, подмножество колледжей, чтобы дать нам последний колледж, который они посещали.

Я все еще не на 100% понимаю, делает ли это именно то, что вы хотите — я не знаю, рассматривали ли вы случай, когда не было колледжей sctcs. В этом начальном коде их нет, но это могло легко произойти.

Комментарии:

1. Я думаю, что ваш первоначальный вопрос выдает плохое понимание того, что такое NA: вы спросили о том, как «избавиться от NAS», но NAS — правильный ответ. Даже изменения в вашем вопросе не учитывают все возможности, что делает возможным возврат NA в непредвиденных случаях, таких как !any(Colleges %in% sctcs)

Ответ №2:

Непонятно, что вы пытаетесь сделать. Но при [!(College %in% sctcs) amp; semester > seq_home] возврате FALSE College[!(College %in% sctcs) amp; semester > seq_home] возвращает вектор символов нулевой длины, поэтому first(College[!(College %in% sctcs) amp; semester > seq_home]) возвращает NA.

Когда в нем нет TRUE значений [!(College %in% sctcs) amp; semester > seq_home] , это потому, что ни в одном из последующих семестров нет колледжей semester[seq_home] , отличных от sctcs . Если учащийся переходит из home_school одной или нескольких школ sctcs, но никогда не переходит ни в одну из школ, отличных от sctcs, вы получите NA значение.

Вы фактически задаете неправильный вопрос. Я не уверен, какой вопрос вы пытаетесь задать, но то, что вы сейчас задаете, это:

Какую первую школу, не связанную с sctcs, посещал этот ученик после того, как они посетили свою первую школу sctcs?

Однако некоторые учащиеся никогда не посещают школу, отличную от sctcs, после посещения своей первой школы sctcs. По этой причине вы получаете NA ответ, который является правильным ответом на вопрос.

Комментарии:

1. Я понимаю, что он возвращает вектор нулевой длины. Я хочу знать, как это исправить. В общем, то, что я пытаюсь сделать, это подсчитать количество учащихся, которые перевелись из школ sctcs. Я начал с выбора первого колледжа в sctcs, но иногда первый колледж sctcs не является первым колледжем, который посещает студент. Затем я нашел первый колледж за пределами sctcs, который должен быть после того, как они поступили в школу sctcs. Например, если учащийся начинает в Clemson -> NETC-> USC, home_school это = NETC и new_school = USC, иначе последняя школа, которую он посещал.

2. Хм, думаю, теперь я понимаю? Я добавил еще несколько деталей к ответу выше. Суть в том, что вы задаете «неправильный вопрос» с помощью выражения подстановки.

3. Я понимаю, что задал неправильный вопрос, есть какие-нибудь идеи о том, как устранить проблему?

4. Я не могу ответить на это, потому что я все еще не уверен, какой вопрос вы пытаетесь задать. Если вы сможете точно сформулировать этот вопрос, вы будете на полпути к ответу на свой собственный вопрос.

5. @Captian Hat нет, это какой-то любимый проект для работы. вопрос, который я задаю: «Какую первую школу, не связанную с sctcs, посещал этот ученик после того, как они посетили свою первую школу sctcs?» и если они не ходили в школу, не связанную с sctcs, какую последнюю школу они посещали?