Создать кросс-таблицу с помощью двух столбцов данных
У меня есть два кадра данных, один из которых называется "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 ответа
За один раз, используя 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
Вот 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
Объедините ваши фреймы данных, используя 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