Данные R.Таблица с весами - PullRequest
1 голос
/ 05 мая 2020
library(data.table)
data = data.table("STUDENT" = c(1:100),
                  "SAMPLEWEIGHT" = sample(12:99, r = T, 100),
"LABEL1" = sample(1:2, r = T, 100),
"LABEL3" = sample(1:3, r = T, 100),
"CAT"=sample(0:1,r = T, 100),
"FOX"=sample(0:1,r = T, 100),
"DOG"=sample(0:1,r = T, 100),
"MOUSE"=sample(0:1,r = T, 100),
"BIRD"=sample(0:1,r = T, 100))

dataWANT = data.frame("LABEL1" = c(1,1,1,2,2,2),
                                            "LABEL3" = c(1,2,3,1,2,3),
                                            "CAT_N" = NA,
                                            "CAT_PER" = NA,
                                            "FOX_N" = NA,
                                            "FOX_PER" = NA,
                                            "DOG_N" = NA,
                                            "DOG_PER" = NA,
                                            "MOUSE_N" = NA,
                                            "MOUSE_PER" = NA,
                                            "BIRD_N" = NA,
                                            "BIRD_PER" = NA)

У меня есть таблица data.table, назовите ее data, и я пытаюсь суммировать данные студента, как показано в dataWANT.

в dataWANT, столбцы с _N в конце просто количество значений в столбце, равное 1 для каждой комбинации LABEL1 и LABEL3, итого 6 групп.

в данных ХОТИТЕ столбцы с _PER в конце - это взвешенная доля групп, которые имеют единицы в своей колонке.

1 Ответ

1 голос
/ 05 мая 2020

Вариант с использованием data.table мог бы состоять в том, чтобы сгруппировать по 'LABEL1', 'LABEL3', указать интересующие столбцы в .SDcols, получить sum (как двоичные столбцы), перебирая .SD и объединить с weighted.mean на основе столбца SAMPLEWEIGHT

library(data.table)
data[, c(setNames(lapply(.SD, sum), paste0(names(.SD), "_N")), 
  setNames(lapply(.SD, function(x) weighted.mean(x == 1, SAMPLEWEIGHT)), 
     paste0(names(.SD), "_PER"))),.(LABEL1, LABEL3), .SDcols = CAT:BIRD]
...