Создание нового кадра данных на основе статистики, рассчитанной из предыдущего кадра данных - PullRequest
1 голос
/ 06 апреля 2020

У меня есть следующий фрейм данных

dat <- data.frame(ID = c(1, 1, 1, 2, 2, 2),
                   A = c(50, 150, 200, 250, 100, NA),
                   B = c(10, NA, 30, NA, NA, 10))

Я хочу создать новый фрейм данных, который сообщит мне процент точек, которые не являются NA, так что

   dat2 <- data.frame(ID = c(1, 2),
                        A =c( 100, 66.6),
                        B = c(66.6, 33.3))

Я могу понять, как вычислить значения в R, но я не могу понять, как поместить вычисления в новый фрейм данных.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

С data.table вы можете сделать это очень эффективно:

library(data.table)
setDT(data)
dat[,.(lapply(.SD, function(x) 100*mean(!is.na(x))), by = "ID"]

.SD означает Подмножество данных вы применяете комбинацию mean + is.na для всех твои колонны. Вы также можете применить это к подмножеству столбцов, используя .SDcols (например, A column):

dat[,.(lapply(.SD, function(x) 100*mean(!is.na(x))),
      by = "ID", .SDcols = c("A")]
0 голосов
/ 06 апреля 2020

Мы можем сделать группу по 'ID' с mean логического вектора не-NA

library(dplyr)
dat %>% 
   group_by(ID) %>% 
   summarise_all(~ 100 *mean(!is.na(.)))
# A tibble: 2 x 3
#     ID     A     B
#  <dbl> <dbl> <dbl>
#1     1 100    66.7
#2     2  66.7  33.3

Или используя aggregate из base R

aggregate(. ~ ID, dat, FUN = function(x) 100 *mean(!is.na(x)), na.action  = NULL)
...