Как создать средства и столбцы SD с data.table (на основе нескольких условий) - PullRequest
3 голосов
/ 25 апреля 2020

Мне удалось создать таблицу с median mean и sd на основе нескольких условий с использованием пакета dplry. Для этого я подготовил данные. Это выглядит немного неаккуратно для меня, и я использую большой набор данных (> 3 ГБ), поэтому я уже использовал data.table.

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

Это то, что у меня есть и нужно:

Мне нужно mean из con на id и date = 1 год с момента первого i или i2 = A04 или A01.

РЕДАКТИРОВАТЬ (потому что он не работал до):

ДАННЫЕ:

DT <- structure(list(id = c(123L, 123L, 332L, 332L, 332L, 100L, 100L, 113L, 113L, 113L, 113L, 551L, 551L), 
               i = c("D95", "F85", "A01", "A04", "K20", "B10", "A04", "T08", "P28", "D95", "A04", "B12", "D95"), 
               i2 = c("F15", "", "", "", "", "", "", "", "", "A01", "", "A01", ""), 
               date = c("2015-06-19", "2016-08-15", "2013-03-16", "2017-01-17", "2013-01-16", "2009-05-08", "2011-04-03", "2015-05-04",
                        "2011-04-04", "2017-08-04", "2011-05-24", "2013-11-04", "2013-05-04"), 
               con = c("1", "1", "1", "1", "1", "1", "1", "1", "1", "1",  "1", "1", "1"), 
               PS = c("0",  "0", "1", "0", "0", "0", "1", "0", "0", "0", "1", "1", "0")), 
          class = "data.frame", row.names = c(NA, -13L))

Вот что я сделал до сих пор (и который работает):

Я создал столбцы PS (= имеющие A01 или A04 в i или i2) и ds (= дни с первого A01 или A01 (дней не было) поправьте здесь)) на основе данных.

С пакетом dplyr я сначала создал data.table только с строками с ds между -365 и 0.

j.ds <- subset(DT, ds >= -365 & ds < 0)

Чем агрегировано в таблицу с sum из con за id, например так:

j <- j.ds %>%
  group_by(id) %>% 
  summarise(con = sum(con))

Оттуда я сделал желаемую таблицу:

jP <- j %>%
  summarise(median = median(con), mean = mean(con), SD = sd(con))

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Насколько я могу судить, вам нужна сумма con на id, для данных, где ds находится между -365 и 0, тогда среднее значение, медиана и стандартное отклонение этих сумм. Это может быть сделано путем объединения двух выражений.

DT[ds >= -365 & ds < 0, sum(con), by = "id"][, .(mean(V1), median(V1), sd(V1))]

Это сначала поднабор ваших данных, затем суммы con на id, затем принимает среднее значение et c. сумм со вторым выражением

1 голос
/ 25 апреля 2020

Поскольку я не могу запустить ваш пример, я даю вам непроверенный data.table перевод вашего dplyr кода.

Вы можете выполнять операции, которые вы выполняли достаточно эффективно, в data.table:

library(data.table)
setDT(jx)
j <- jx[ds >= -365 & ds < 0, lapply(.SD, sum), by = "id"]
jP <- j[, lapply(.SD, function(x) return(c(median(x), mean(x), sd(x)))]
jP[,'stat' := c("median","mean","sd")

В конечном итоге вы получите длинный форматированный фрейм данных.

Редактировать

Если у вас есть нечисловые столбцы c, вы не должны их суммировать. Вы можете управлять столбцами, используемыми в .SD, с помощью .SDcols. Например, в вашем примере столбцы символьные: для суммирования необходимо преобразовать их в число c. Например, если вас интересуют столбцы con и PS, вы должны сделать:

cols <- c("con","PS")
j <- DT[,lapply(.SD, function(x) sum(as.numeric(x))), by = "id", .SDcols = cols]

С function(x) sum(as.numeric(x)) вы создаете анонимную функцию (эквивалентную lambda функциям в python который применяется как .numeri c и суммирует все элементы в subset of data (SD).

Анонимная функция return(c(median(x), mean(x), sd(x))) следует той же логике c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...