Пошаговая статистика кадра данных, содержащего несколько столбцов с NA в R - PullRequest
0 голосов
/ 25 марта 2020

Обзор проблемы

Привет, эксперты R,

Я буду признателен за вашу поддержку в решении этой проблемы. Я пытаюсь вычислить вычисления строк для большого фрейма данных - 15 тыс. Строк, 700 столбцов, в которые входят NA. Я хочу вычислить следующие значения для представления новых столбцов: Мин., Макс., Среднее, Медиана, Стандартное отклонение, дисперсия, 10-й процентиль, 30-й перцентиль, 70-й перцентиль, 90-й процентиль

В тех случаях, когда есть NA, вычисления должны пропускать их , Используется na.rm = True в строках dplyr ie, но безуспешно.

Код для загрузки подмножества фрейма данных

#Please note that the real dataframe has hundreds of columns, so typing each column won't be possible

df<- data.frame(a1=c(1,NA,0,4), a2=c(NA,1,0,6), a3=c(NA,NA,9,3),a4=c(1,NA,NA,4), a5=c(4,NA,NA,6), a6=c(7,NA,9,3),a7=c(1,1,1,1),a8=c(2,2,2,2), a9=c(4,3,3,6), a10=c(7,4,9,3))
df
  a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
1  1 NA NA  1  4  7  1  2  4   7
2 NA  1 NA NA NA NA  1  2  3   4
3  0  0  9 NA NA  9  1  2  3   9
4  4  6  3  4  6  3  1  2  6   3

Ожидаемый результат

Я хотел бы получить статистику, как указано выше для каждой строки. Я получаю ошибки при использовании поточечного вычисления dplyr из-за NA, несмотря на использование argumemnt "na.rm = True"

df
  a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 min mean median max sd variance per10 per30 per70 per90
1  1 NA NA  1  4  7  1  2  4   7   x    x      x   x  x        x     x     x     x     x
2 NA  1 NA NA NA NA  1  2  3   4   x    x      x   x  x        x     x     x     x     x
3  0  0  9 NA NA  9  1  2  3   9   x    x      x   x  x        x     x     x     x     x
4  4  6  3  4  6  3  1  2  6   3   x    x      x   x  x        x     x     x     x     x

Спасибо в предвкушении за вашу помощь и в росте сообщества R

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Я включил только столбцы mean и sd. Вы можете сделать то же самое для других параметров.

library(dplyr)
df %>% mutate(mean = apply(df, MARGIN = 1, FUN = mean, na.rm = TRUE),
                sd = apply(df, MARGIN = 1, FUN = sd, na.rm = TRUE))
0 голосов
/ 25 марта 2020

df$min<-apply(df,1,min,na.rm=TRUE)
df$mean<-apply(df,1,mean,na.rm=TRUE)
df$median<-apply(df,1,median,na.rm=TRUE)
df$max<-apply(df,1,max,na.rm=TRUE)
df$sd<-apply(df,1,sd,na.rm=TRUE)
df$variance<-apply(df,1,var,na.rm=TRUE)
df$per10<-apply(df,1,quantile,probs=0.1,na.rm=TRUE)
df$per30<-apply(df,1,quantile,probs=0.3,na.rm=TRUE)
df$per70<-apply(df,1,quantile,probs=0.7,na.rm=TRUE)
df$per90<-apply(df,1,quantile,probs=0.9,na.rm=TRUE)

конечно, вы можете перебрать "eval (parse ..)" по вектору функций для того же результата и меньше кода

...