Объединение данных в R с тем же выводом, что и в электронной таблице - PullRequest
1 голос
/ 12 февраля 2020

У меня есть пример данных:

set.seed(25)

xx <- data.table(
  year = 2015,
  values = iris$Sepal.Length,
  score = sample(1:8, nrow(iris), replace = TRUE))

Фактические данные содержат много лет и строк. Я хотел сгруппировать столбец values, используя функцию cut() в base R, но результат отличается от результата, сгенерированного в сводной таблице LibreOffice Cal c (даже в MS Office Excel). Это то, что я сделал до сих пор:

brks <- seq(0, ceiling(max(xx$values)), 0.5)
xx[, bins := cut(values, brks, ordered_result = TRUE)]
xx_binned <- dcast(xx, bins ~ year, length, value.var = "values")
xx_binned <- melt(xx_binned, id.vars = "bins", value.name = "value")

Я начал с 0, так что это будет согласованно, если я буду использовать другие данные. В электронной таблице я также начал с 0 как начальный номер.

Результат приведенных выше кодов таков:

     bins   variable value
1   (4,4.5] 2015     5
2   (4.5,5] 2015     27
3   (5,5.5] 2015     27
4   (5.5,6] 2015     30
5   (6,6.5] 2015     31
6   (6.5,7] 2015     18
7   (7,7.5] 2015     6
8   (7.5,8] 2015     6

Это результат LibreOffice Cal c:

values  2015
4-4.5   15
4.5-5   106
5-5.5   100
5.5-6   142
6-6.5   148
6.5-7   95
7-7.5   25
7.5-8   27

Как сделать так же? Я пишу функцию, конвертирующую инструменты электронной таблицы в функцию R, и хочу, чтобы она была такой же, как в выходных данных электронной таблицы.

Спасибо.

1 Ответ

1 голос
/ 12 февраля 2020

Вы должны суммировать score, а не количество дел, чтобы прийти к тем же значениям.

aggregate(xx$score, list(cut(xx$values, brks, right=FALSE, ordered_result = TRUE)), sum)
#  Group.1   x
#1 [4,4.5)  15
#2 [4.5,5) 106
#3 [5,5.5) 100
#4 [5.5,6) 142
#5 [6,6.5) 148
#6 [6.5,7)  95
#7 [7,7.5)  25
#8 [7.5,8)  27

Или обновить свой код:

library(data.table)
xx <- data.table(xx)
xx[, bins := cut(values, brks, right=FALSE, ordered_result = TRUE)]
dcast(xx, bins ~ year, sum, value.var = "score")

Данные:

set.seed(25)

xx <- data.frame(
  year = 2015,
  values = iris$Sepal.Length,
  score = sample(1:8, nrow(iris), replace = TRUE))
brks <- seq(0, ceiling(max(xx$values)), 0.5)
...