Создать кросс-таблицу с помощью двух столбцов данных - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть два кадра данных, один из которых называется "Students.short", сгенерированный с помощью:

students.short <- data.frame(shoesize=c(38,39,38,38,39,38,37,36),
 population=c("kuopio","kuopio","kuopio","tampere",
 "tampere","tampere","tampere","tampere"))

students.short

  shoesize population
1       38     kuopio
2       39     kuopio
3       38     kuopio
4       38     kuopio
5       39    tampere
6       38    tampere
7       37    tampere
8       36    tampere

и другой, называемый "Students.tall":

students.tall <- data.frame(shoesize=c(44,42,43,43,42,44,43,43),
 population=c("kuopio","kuopio","kuopio","kuopio",
 "tampere","tampere","tampere","tampere"))

students.tall

  shoesize population
1       44     kuopio
2       42     kuopio
3       43     kuopio
4       43     kuopio
5       42    tampere
6       44    tampere
7       43    tampere
8       43    tampere

и мне нужно создать перекрестную таблицу между населением (kuopio или tampere) и средним размером каждого кадра данных, например

                       kuopio   tampere

studenst.short          38.3       37.6

studenst.tall             43         43

Я не могу найти простой или простой способ сделать это, любую идею или любую помощь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вот ответ dplyr.Сначала мы связываем два фрейма данных, используя аргумент .id, чтобы различать фреймы данных.Затем мы group_by .id и population и вычисляем среднее значение, т.е.

library(dplyr)

bind_rows(df1, df2, .id = 'group') %>% 
       group_by(group, population) %>% 
       summarise(new = mean(shoesize))

, что дает

# A tibble: 4 x 3
# Groups:   group [?]
  group population   new
  <chr> <fct>      <dbl>
1 1     kuopio      38.3
2 1     tampere     37.6
3 2     kuopio      43  
4 2     tampere     43
0 голосов
/ 17 ноября 2018

За один раз, сначала используя data.table

  • , создайте именованный список data.tables (используя setDT())
  • , затем свяжите списки вместе (используя rbindlist(), используя имена в качестве идентификатора (idcol = TRUE).
  • последний, dcast в широком формате, суммируя с mean из value.var; shoesize

код

library( data.table )

dcast( rbindlist( list( students.short = setDT( students.short ), 
                        students.tall = setDT( students.tall ) ),
                  idcol = TRUE ),
       .id ~ population, 
       value.var = "shoesize", 
       fun = mean )

#               .id   kuopio tampere
# 1: students.short 38.33333    37.6
# 2:  students.tall 43.00000    43.0
0 голосов
/ 16 ноября 2018

Объедините ваши фреймы данных, используя сначала rbind():

df <- rbind(studnets.short, students.tall)
df$height_cat <- rep(c("short", "tall"), # create categorical height variable
   c(nrow(students.short), nrow(students.tall)))

Затем используйте tapply().Для этого фиктивного фрейма данных он работает так:

df <- data.frame(size = round(rnorm(30, 39, 2)),
                 pop = sample(c("kuopio", "tampere"), 30, replace = T),
                 height = sample(c("short", "tall"), 30, replace = T))
tapply(df$size, INDEX = df[c(3, 2)], mean, na.rm=T)
# df[c(3, 2)] refers to height and pop columns of df respectively

       pop
height  kuopio  tampere
  short     39 39.57143
  tall      41 39.22222
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...