-1
data=data.frame("name"=c("Jimmy","Ellie","Lashay","Kristyn","Gloria","Carmen","Monica","Nicky","Kirby","Corrie","Dwayne","Janee","Nova","Bruce","Denita","Vickie","Ramon","Jacquline","Myrtice","Nadene","Jimmy","Ellie","Lashay","Kristyn","Gloria","Carmen","Monica","Nicky","Kirby","Corrie","Dwayne","Janee","Nova","Bruce","Denita","Vickie","Ramon","Jacquline","Myrtice","Nadene","Jimmy","Ellie","Lashay","Kristyn","Gloria","Carmen","Monica","Nicky","Kirby","Corrie","Dwayne","Janee","Nova","Bruce","Denita","Vickie","Ramon","Jacquline","Myrtice","Nadene"),
"score"=c("71","83","58","72","80","89","74","76","46","81","60","84","80","95","44","61","93","93","59","52","99","97","96","76","56","89","46","71","64","47","57","62","51","98","54","94","44","90","41","52","62","93","48","44","89","52","87","69","54","65","74","81","78","67","63","93","80","100","54","94"),
"class"=c("literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities"))

Each student has 1 score for each subject so each student is represented 3 times over.

Firstly, I want to sort the names by score (high to low) for the science category.

data=data[order(data$score,data$name,data$class=="science"),] #this is my attempt

Second, I want to store the order of the names for the science category.

#I am unsure how to do this

Thirdly, I wish to replicate the stored order of names from Step 2

#I am unsure how to do this

Fourth, I wish to match the ordered names with the scores for each subject.

#I am unsure how to do this

Here is a more basic example: Have:

Name    Score    Subject
John      5         literature
Jack      4         literature
Jill      2         literature
John      7         science
Jack      9         science
Jill      10        science

Want:

name    jill    jack    john
science    10    9      7
literature  2    4      5
bvowe
  • 2,252
  • 10
  • 18
  • Possible duplicate of [How to sort a dataframe by multiple column(s)](https://stackoverflow.com/questions/1296646/how-to-sort-a-dataframe-by-multiple-columns) – sindri_baldur Jul 25 '19 at 19:23
  • 1
    bvowe, your sorting logic is not very clear -- when you spread the sorted data to your desired output, the data will no longer be ordered (ie, Jill will be first for science, but is also 'first' for literature, even though she has the lowest score). Do you just want your data spread from long to wide, with names as columns and subjects as rows? – kstew Jul 25 '19 at 19:26

2 Answers2

1
data=data.frame("name"=c("Jimmy","Ellie","Lashay","Kristyn","Gloria","Carmen","Monica","Nicky","Kirby","Corrie","Dwayne","Janee","Nova","Bruce","Denita","Vickie","Ramon","Jacquline","Myrtice","Nadene","Jimmy","Ellie","Lashay","Kristyn","Gloria","Carmen","Monica","Nicky","Kirby","Corrie","Dwayne","Janee","Nova","Bruce","Denita","Vickie","Ramon","Jacquline","Myrtice","Nadene","Jimmy","Ellie","Lashay","Kristyn","Gloria","Carmen","Monica","Nicky","Kirby","Corrie","Dwayne","Janee","Nova","Bruce","Denita","Vickie","Ramon","Jacquline","Myrtice","Nadene"),
                "score"=c("71","83","58","72","80","89","74","76","46","81","60","84","80","95","44","61","93","93","59","52","99","97","96","76","56","89","46","71","64","47","57","62","51","98","54","94","44","90","41","52","62","93","48","44","89","52","87","69","54","65","74","81","78","67","63","93","80","100","54","94"),
                "class"=c("literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","literature","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","science","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities","humanities"),
                stringsAsFactors = F) ### don't convert to factors!

data %>% mutate(score=as.numeric(score)) %>% # convert scores to numeric for sorting
  arrange(desc(score,class)) %>% group_by(class) %>% 
  mutate(place=seq(1,n())) %>% ungroup() %>% 
  select(-score) %>%
  # spread(class,name)
  reshape2::dcast(class~place,value.var = 'name')

       class         1      2         3      4      5         6      7       8     9     10     11
1 humanities Jacquline Nadene     Ellie Vickie Gloria    Monica  Janee   Ramon  Nova Dwayne  Nicky
2 literature     Bruce  Ramon Jacquline Carmen  Janee     Ellie Corrie  Gloria  Nova  Nicky Monica
3    science     Jimmy  Bruce     Ellie Lashay Vickie Jacquline Carmen Kristyn Nicky  Kirby  Janee
       12     13     14     15      16      17     18     19      20
1   Bruce Corrie Denita  Jimmy   Kirby Myrtice Carmen Lashay Kristyn
2 Kristyn  Jimmy Vickie Dwayne Myrtice  Lashay Nadene  Kirby  Denita
3  Dwayne Gloria Denita Nadene    Nova  Corrie Monica  Ramon Myrtice

Or, if you just want to spread your original data...

data %>% spread(name,score)

       class Bruce Carmen Corrie Denita Dwayne Ellie Gloria Jacquline Janee Jimmy Kirby Kristyn Lashay
1 humanities    67     52     65     63     74    93     89       100    81    62    54      44     48
2 literature    95     89     81     44     60    83     80        93    84    71    46      72     58
3    science    98     89     47     54     57    97     56        90    62    99    64      76     96
  Monica Myrtice Nadene Nicky Nova Ramon Vickie
1     87      54     94    69   78    80     93
2     74      59     52    76   80    93     61
3     46      41     52    71   51    44     94
kstew
  • 1,048
  • 5
  • 21
0

Here's a way with dplyr -

data %>% 
  spread(name, score, convert = T) %>% 
  select(1, order(.[.$class == "science", -1], decreasing = T) + 1)

       class Jimmy Bruce Ellie Lashay Vickie Jacquline Carmen Kristyn Nicky Kirby Janee Dwayne Gloria Denita Nadene Nova Corrie Monica Ramon Myrtice
1 humanities    62    67    93     48     93       100     52      44    69    54    81     74     89     63     94   78     65     87    80      54
2 literature    71    95    83     58     61        93     89      72    76    46    84     60     80     44     52   80     81     74    93      59
3    science    99    98    97     96     94        90     89      76    71    64    62     57     56     54     52   51     47     46    44      41
Shree
  • 9,963
  • 1
  • 11
  • 31