Сортировка строк в кадре данных на основе пользовательского идентификатора - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть датафрейм имени студента и идентификаторов кодов ( P и V )

StudName     Code     ID
John           P      a1
Sam            V      a2
John           V      a3
Alex           P      a4
Sam            P      a5
Alex           V      a6
Stuart         P      a7
John           V      a8

Что я хочу сделать сейчас, это переставить строки для каждого учащегося , в которых Код определяет приоритет . (V -> P). Это означает, что для каждого студента, если у него есть код V , тогда строка будет выше строки с кодом P .

Например, Джон имеет оба код P и V, и поскольку V имеет приоритет над P , он будет помещен на над P , следовательно:

StudName     Code      ID
John         V         a3
John         V         a8
John         P         a1

Результирующий кадр данных будет:

StudName     Code      ID
 John         V        a3
 John         V        a8
 John         P        a1
 Sam          V        a2
 Sam          P        a5
 Alex         V        a6
 Alex         P        a4
 Stuart       P        a7

Следовательно, для каждого учащегося, если у него есть код V, сначала всегда будет располагаться V, а затем P.

Буду признателен за помощь.

Редактировать Обновленный пример: Ученик, у которого более одного Ps или Vs

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Вот вариант с dplyr

library(dplyr)
df %>% 
    arrange(factor(StudName, levels = unique(StudName)), 
      Code != 'V')
#  StudName Code ID
#1     John    V a3
#2     John    V a8
#3     John    P a1
#4      Sam    V a2
#5      Sam    P a5
#6     Alex    V a6
#7     Alex    P a4
#8   Stuart    P a7

data

df <- structure(list(StudName = c("John", "Sam", "John", "Alex", "Sam", 
"Alex", "Stuart", "John"), Code = c("P", "V", "V", "P", "P", 
"V", "P", "V"), ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7", 
"a8")), class = "data.frame", row.names = c(NA, -8L))
0 голосов
/ 10 февраля 2020

Вот базовое решение R

dfout <- df[order(factor(df$StudName, levels = unique(df$StudName)),
                  factor(df$Code, levels = c("V","P"))),]

такое, что

> dfout
  StudName Code ID
3     John    V a3
8     John    V a8
1     John    P a1
2      Sam    V a2
5      Sam    P a5
6     Alex    V a6
4     Alex    P a4
7   Stuart    P a7

или

dfout <- do.call(rbind,
                 c(make.row.names = F,
                   lapply(split(df,factor(df$StudName, levels = unique(df$StudName))), 
                          function(x) x[order(x$Code,decreasing = TRUE),])))

такое, что

> dfout
  StudName Code ID
1     John    V a3
2     John    V a8
3     John    P a1
4      Sam    V a2
5      Sam    P a5
6     Alex    V a6
7     Alex    P a4
8   Stuart    P a7

ДАННЫЕ

df <- structure(list(StudName = c("John", "Sam", "John", "Alex", "Sam", 
"Alex", "Stuart", "John"), Code = c("P", "V", "V", "P", "P", 
"V", "P", "V"), ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7", 
"a8")), class = "data.frame", row.names = c(NA, -8L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...