Применить список функций к столбцам в R, чтобы заполнить таблицу - PullRequest
0 голосов
/ 05 мая 2020

У меня есть фрейм данных в R, назовем его df, который я хотел бы проанализировать с точки зрения среднего, медианного, стандартного отклонения, IQR и c по столбцам. Я подготовил краткие функции (где это не просто mean или sd), которые могут принимать вектор в качестве входных и выходных данных, например, IQR или коэффициент дисперсии. Теперь, если я хочу применить любой из них к атрибутам (столбцам), я могу использовать, например, IQRs <- apply(df,2,IQR).

Мой вопрос: как я могу применить несколько этих функций вместе (на самом деле, я хочу объединить их все вместе), чтобы заполнить таблицу, в которой будет один столбец для атрибутов, а затем один столбец для каждой функции (т.е. означает, что будет один столбец, IQR будет одним столбцом), а различные атрибуты фрейма данных (которые были столбцами в df) будут строками этой таблицы (перечисленными в первом столбце)?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Вы можете использовать tidyr::gather и dplyr::summarize:

# Toy data
df <- data.frame(x = 1:10, y = 11:20)

# Libs
library(tidyverse)

# Code
df %>% 
    gather(var, val) %>% 
    group_by(var) %>% 
    summarize(med = median(val), mean = mean(val), iqr = IQR(val))

Вывод:

# A tibble: 2 x 4
  var     med  mean   iqr
  <chr> <dbl> <dbl> <dbl>
1 x       5.5   5.5   4.5
2 y      15.5  15.5   4.5
0 голосов
/ 05 мая 2020

Предположим, ваши данные выглядят так:

set.seed(69)
df <- data.frame(A = rnorm(5), B = rnorm(5), C = rnorm(5))

И имена ваших функций были такими:

funcs <- c("mean", "median", "sd", "var", "min", "max")

Тогда вы можете использовать apply внутри lapply как это:

as.data.frame(setNames(lapply(funcs, function(f) apply(df, 2, as.name(f))), funcs))
#>        mean     median        sd       var       min       max
#> A -0.3546864 -0.3348139 0.5948611 0.3538597 -0.949889 0.3743156
#> B -0.2016318 -0.9039467 1.4092795 1.9860687 -1.571073 1.4440935
#> C -0.3537707 -0.1691765 0.7955558 0.6329090 -1.311374 0.4149940
...