#r #function #sapply
Вопрос:
Пытаюсь выполнить функцию повтора и описательную статистику. Строка ниже
print (table <- data.frame(replicate(5,sample(50:100,10,rep=TRUE))))
создает таблицу на изображении.
Я хотел бы сделать некоторую описательную статистику по столбцам X1 и X4, используя приведенную ниже кодировку.
GenStats <- function(x){
newMatrix <- matrix (1:8, nrow = 1)
colnames(newMatrix) <- c("Mean", "Median", "Maximum", "Variance", "Minimum", "Skewness",
"Kurtosis", "Std.Dev")
rownames(newMatrix) <- "Key Statistics"
newMatrix[1,] <- c(mean(x), median(x), max(x), var(x), min(x),
skewness(x), kurtosis(x), sd(x))
newMatrix
}
Я могу заставить это работать для 1 образца, например
x
Тогда мой вопрос — как мне посмотреть на два образца (обработанных независимо), например, X1 и X4?
Я попробовал это —
x <- c("table$X1", "table$X4")
но это не сработало.
Затем я попытался использовать sapply, например
sapply(x, function(x) {
(x[, c(mean, median, sd)])
})
но получил неожиданное»} » в сообщении об ошибке.
Как всегда, был бы признателен, если бы кто-нибудь мог меня направить.
Заранее спасибо.
Комментарии:
1. Что
x
у тебя в карманеsapply()
? У вас естьfunction(y)
, но он неy
используется. Кроме того, что такоеy
? (первый вsapply
)2. Прошу прощения, Сотос, исправили.
Ответ №1:
Решает ли это вашу проблему?
library(dplyr)
output <- sapply(table %>% select(X1,X4), FUN = GenStats)
rownames(output) <- c("Mean", "Median", "Maximum", "Variance", "Minimum", "Skewness",
"Kurtosis", "Std.Dev")
output
X1 X4
Mean 78.9000000 76.10000000
Median 84.0000000 74.50000000
Maximum 96.0000000 95.00000000
Variance 286.9888889 222.54444444
Minimum 52.0000000 53.00000000
Skewness -0.4325578 -0.03126238
Kurtosis -1.5714491 -1.59510245
Std.Dev 16.9407464 14.91792360
Изменить: Вы можете заменить X1 и X4 в первой строке, чтобы применить функцию к нужным столбцам
Комментарии:
1. Не используйте
apply
на фреймах данных.apply
принуждает к матрице перед любыми операциями, что делает ее неэффективной. Вы должны использовать его только в том случае, если входные данные являются матрицей. Для фреймов данных,sapply
илиlapply
лучше2. Я всего этого не знал @Sotos, спасибо за эти знания. Поэтому я редактировал с помощью sapply
3. Монджяньян, какая библиотека требуется, чтобы я мог использовать %>%>>.? … не удалось найти функцию…
4. Извините, это
dplyr
5. Зачем загружать
dplyr
только для выбора столбцов? Почему бы просто неsapply(table[c('X1', 'X4')], GenStats)
Ответ №2:
Вы могли бы использовать describe
из psych
библиотеки:
library(psych)
describe(table[,c("X1", "X4")])
Выход:
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 10 67.2 16.61 61.5 65.25 14.83 50 100 50 0.64 -1.08 5.25
X4 2 10 72.6 15.92 73.0 72.62 22.24 53 92 39 0.00 -1.90 5.03
ИЛИ: с вашей собственной функцией
С lapply
уведомлением skewness
изменяется на перекос и kurtosis
на kurtosi
library(psych)
GenStats <- function(x){
newMatrix <- matrix (1:8, nrow = 1)
colnames(newMatrix) <- c("Mean", "Median", "Maximum", "Variance", "Minimum", "Skewness",
"Kurtosis", "Std.Dev")
rownames(newMatrix) <- "Key Statistics"
newMatrix[1,] <- c(mean(x), median(x), max(x), var(x), min(x),
skew(x), kurtosi(x), sd(x))
newMatrix
}
lapply(table[,c(1,4)], GenStats)
Выход:
$X1
Mean Median Maximum Variance Minimum Skewness Kurtosis Std.Dev
Key Statistics 67.2 61.5 100 275.9556 50 0.6432985 -1.079559 16.61191
$X4
Mean Median Maximum Variance Minimum Skewness Kurtosis Std.Dev
Key Statistics 72.6 73 92 253.3778 53 0.004540284 -1.90361 15.91784