TidyR получить уникальные значения по нескольким столбцам и преобразовать в имена столбцов? - PullRequest
0 голосов
/ 09 октября 2019

, поэтому я пытаюсь привести в порядок набор данных, указав в своих строках имена учеников и столбцы, все доступные курсы (HUDK4050 и т. Д.). Однако, похоже, мне нужно создать новую колонку для каждого уникального курса. Каков наилучший способ сделать это? Я убрал часть кода, исправив проблемы с пробелами и заглавными буквами и т. Д.

  StudentName  Class1   Class2   Class3   Class4   Class5   Class6  
  <chr>        <chr>    <chr>    <chr>    <chr>    <chr>    <chr>   
1 Student1     ITSF4090 ITSF5008 ITSF5035 HUDK4050 NA       NA      
2 Student2     HUDK4050 QMSS5010 QMSS5015 QMSS5072 STAT4205 QMSS5021
3 Student3     HUDK4050 ITSF4090 ITSF4025 ITSF5035 NA       NA      
4 Student4     HUDK4050 HUDK4029 HUDK4052 CCPJ5062 A&HA4063 NA      
5 Student5     HUDK4050 HUDK4052 HUDK4029 NA       NA       NA      
6 Student6     HUDK4050 HUDM4125 HUDM5026 HUDM5126 NA       NA   

что-то вроде этого

  StudentName  HUDK4050 HUDK4029   Class3   Class4   Class5   Class6  
  <chr>        <chr>    <chr>    <chr>    <chr>    <chr>    <chr>   
1 Student1     1         1
2 Student2     1         0
3 Student3     1         0
4 Student4     0         1
5 Student5     1         1
6 Student6     1         1

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Это также подход сначала к конвертации в long, для этого я использую melt, затем берю новый столбец всего содержимого предыдущего столбца для использования в качестве выходных столбцов при приведении к wide, что я делаю с dcast.

libary(data.table)

dcast(melt(df, 1, na.rm = T), StudentName ~ value, value.var = 'variable', 
      fun.aggregate = length)


#   StudentName A&HA4063 CCPJ5062 HUDK4029 HUDK4050 HUDK4052 HUDM4125 HUDM5026 HUDM5126 ITSF4025
# 1    Student1        0        0        0        1        0        0        0        0        0
# 2    Student2        0        0        0        1        0        0        0        0        0
# 3    Student3        0        0        0        1        0        0        0        0        1
# 4    Student4        1        1        1        1        1        0        0        0        0
# 5    Student5        0        0        1        1        1        0        0        0        0
# 6    Student6        0        0        0        1        0        1        1        1        0
#   ITSF4090 ITSF5008 ITSF5035 QMSS5010 QMSS5015 QMSS5021 QMSS5072 STAT4205
# 1        1        1        1        0        0        0        0        0
# 2        0        0        0        1        1        1        1        1
# 3        1        0        1        0        0        0        0        0
# 4        0        0        0        0        0        0        0        0
# 5        0        0        0        0        0        0        0        0
# 6        0        0        0        0        0        0        0        0
1 голос
/ 09 октября 2019

Мы можем преобразовать в «длинный» формат, получить элементы distinct, создать столбец из 1 с, а затем преобразовать обратно в «широкий» формат в tidyverse

library(dplyr)
library(tidyr) #1.0.0
df1 %>% 
   pivot_longer(cols = -StudentName, values_drop_na = TRUE) %>% 
   distinct(StudentName, value) %>% 
   mutate(n = 1) %>%
   pivot_wider(names_from = value, values_from= n, values_fill = list(n = 0))
# A tibble: 6 x 18
#  StudentName ITSF4090 ITSF5008 ITSF5035 HUDK4050 QMSS5010 QMSS5015 QMSS5072 STAT4205 QMSS5021 ITSF4025 HUDK4029 HUDK4052 CCPJ5062 `A&HA4063`
#  <chr>          <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>      <dbl>
#1 Student1           1        1        1        1        0        0        0        0        0        0        0        0        0          0
#2 Student2           0        0        0        1        1        1        1        1        1        0        0        0        0          0
#3 Student3           1        0        1        1        0        0        0        0        0        1        0        0        0          0
#4 Student4           0        0        0        1        0        0        0        0        0        0        1        1        1          1
#5 Student5           0        0        0        1        0        0        0        0        0        0        1        1        0          0
#6 Student6           0        0        0        1        0        0        0        0        0        0        0        0        0          0
# … with 3 more variables: HUDM4125 <dbl>, HUDM5026 <dbl>, HUDM5126 <dbl>

data

df1 <- structure(list(StudentName = c("Student1", "Student2", "Student3", 
"Student4", "Student5", "Student6"), Class1 = c("ITSF4090", "HUDK4050", 
"HUDK4050", "HUDK4050", "HUDK4050", "HUDK4050"), Class2 = c("ITSF5008", 
"QMSS5010", "ITSF4090", "HUDK4029", "HUDK4052", "HUDM4125"), 
    Class3 = c("ITSF5035", "QMSS5015", "ITSF4025", "HUDK4052", 
    "HUDK4029", "HUDM5026"), Class4 = c("HUDK4050", "QMSS5072", 
    "ITSF5035", "CCPJ5062", NA, "HUDM5126"), Class5 = c(NA, "STAT4205", 
    NA, "A&HA4063", NA, NA), Class6 = c(NA, "QMSS5021", NA, NA, 
    NA, NA)), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6"))
...