Есть ли функция R для таблицы частот? - PullRequest
1 голос
/ 04 мая 2019

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

Class     Status   Name
History   teacher  A
History   student  B
History   student  C
Geo       teacher  A
Geo       student  C
Bio       teacher  B
Bio       student  C

, и я хотел бы получить кросс-таблицу частот (отображающую статус каждого человека и класс, где это происходит)

Student\Teacher  A            B         C
A                   
B                History
C                History;Geo  Bio

Идея состоит в том, чтобы попытаться измерить, как определенные люди стремятся работать вместе (как, например, некоторые студенты хотят учиться из-за своего профессора или типа класса), и как часто они выполняют каждую роль.Каждый может быть и учителем, или учеником, в зависимости от класса, некоторые из них никогда не учатся, другие никогда не учат.

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

Я надеюсь, что это было понятно, но, конечно, дайте мне знать, если я могу быть более точным.

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Изменение порядка данных - используя данные @ akrun

L <- split(df1, df1$Status)
newdf <- Reduce(function(x, y) merge(x, y, by="Class", all=TRUE), L)

Вот как это выглядит

    Class Status.x Name.x Status.y Name.y
1     Bio  student      C  teacher      B
2     Geo  student      C  teacher      A
3 History  student      B  teacher      A
4 History  student      C  teacher      A

Использование tidyverse

result <- newdf %>% 
              group_by(Name.x, Name.y) %>% 
              summarise(Class = paste(Class, collapse=';')) %>% 
              complete(Name.x = LETTERS[1:3], Name.y = LETTERS[1:3]) %>% 
              distinct() %>% 
              spread(Name.y, Class)

Результат

# A tibble: 3 x 4
# Groups:   Name [3]
  Name  A           B     C
  <chr> <chr>       <chr> <chr>
1 A     NA          NA    NA
2 B     History     NA    NA
3 C     Geo;History Bio   NA
0 голосов
/ 04 мая 2019

Мы можем group_by «Имя», «Статус», paste unique элементы «Класса» в виде строки и spread из «длинного» в «широкий» формат

library(tidyverse)
df1 %>% 
  group_by(Name, Status) %>% 
  summarise(Class = str_c(unique(Class), collapse=";")) %>% 
  spread(Name, Class)
# A tibble: 2 x 4
#  Status  A           B       C              
#  <chr>   <chr>       <chr>   <chr>          
#1 student <NA>        History History;Geo;Bio
#2 teacher History;Geo Bio     <NA>           

данные

df1 <- structure(list(Class = c("History", "History", "History", "Geo", 
"Geo", "Bio", "Bio"), Status = c("teacher", "student", "student", 
"teacher", "student", "teacher", "student"), Name = c("A", "B", 
"C", "A", "C", "B", "C")), class = "data.frame", row.names = c(NA, 
-7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...