Как создать несколько сводных статистических данных (среднее значение, sd, диапазон, размер выборки) для нескольких категорий (разные измерения в строке 1) из разных видов (в столбце 1) одновременно и распечатать их, используя «write .csv() в один файл данных. Я могу сделать это достаточно легко, если я делаю это по одному виду за раз, но я хотел бы поместить все данные из всех видов в один. CSV-файл, генерируя статистику сумм одновременно. "Сводная статистика в R
ответ
Я знаю, о чем вы говорите. Предположим, вы хотите получить среднее, стандартное отклонение, диапазон и размер выборки. Поскольку R дает диапазон функций, который не дает вам число, но наименьшее число с запятой наибольшее число в наборе данных, это дает мне проблему. Магия находится в tapply(). Я просто использовал транспонирование t() и as.matrix, чтобы упростить установку в фрейм данных.
В любом случае, посмотрите на встроенный набор данных диафрагмы.
data(iris)
Я собираюсь дать вам среднее, SD, и размер выборки для всех этих только в отношении чашелистник длины, записать все значения в строках dataframe с rbind, а затем, наконец, дать Ряды имена с rownames().
Просто сделай это:
mean_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, mean)))
mean_sepal_length
sd_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, FUN = sd)))
sd_sepal_length
sample_size_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, FUN = length)))
sample_size_sepal_length
df_sepal_length <- data.frame(mean_sepal_length)
df_sepal_length
View(df_sepal_length)
df_sepal_length = rbind(df_sepal_length, sd_sepal_length)
df_sepal_length = rbind(df_sepal_length, sample_size_sepal_length)
rownames(df_sepal_length) <- c("Mean_sepal_length", "sd_sepal_length", "size_sepal_length")
write.csv(df_sepal_length, "C:/Users/me/Documents/tapply_miracle.csv")
Большое спасибо. Я могу получить все эти данные для каждого вида отдельно, но когда я хочу, чтобы эти данные для кратных видов в одной и той же матрице данных (CSV-файл), я хотел бы делать их все за раз, а не разрезать матрицу на отдельные виды матрицы данных для запуска отдельно. Есть ли для этого сценарий? –
Я думал о моем ответе, который я дал обратно в тот же день, и я подумал, что это могло бы быть лучше, когда я понял, что tapply функция может принимать переменную INDEX как список. В моем примере я знал, что tapply может классифицировать один фактор, но мы можем указать несколько факторов. Хитрость заключается в том, чтобы расплавить диафрагмы dataframe от широкоугольных в длинную форму, что делает его более удобным для чтения с помощью функции расплава(), а затем tapply со списком аргументами:
> install.packages("reshape2")
> library(reshape2)
# I used melt to restyle the iris dataframe from wide to long turning the many columns into rows with less columns, and I coerced the iris dataset back to a dataframe.
> iris_melt <- data.frame(melt(data = iris, id = "Species", variable.name = "iris_factors", value.name = "iris_dimensions_cm"))
> head(iris_melt)
Species iris_factors iris_dimensions_cm
1 setosa Sepal.Length 5.1
2 setosa Sepal.Length 4.9
3 setosa Sepal.Length 4.7
4 setosa Sepal.Length 4.6
5 setosa Sepal.Length 5.0
6 setosa Sepal.Length 5.4
Здесь мы получим размеры среднего цветка всех диафрагмы: длина спада, ширина сепарины, длина лепестка, & Ширина лепестков по всем видам (сетса, виргиния, versicolor).
> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$Species, iris_melt$iris_factors), FUN = mean)
Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026
Если мы изменим порядок факторов в индексированных списке, мы можем получить ту же информацию, представленную нам в слегка разностной формате, щелкая строки и столбцы:
> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$iris_factors, iris_melt$Species), FUN = mean)
setosa versicolor virginica
Sepal.Length 5.006 5.936 6.588
Sepal.Width 3.428 2.770 2.974
Petal.Length 1.462 4.260 5.552
Petal.Width 0.246 1.326 2.026
Получение стандартное отклонение легко. Просто измените аргумент FUN:
> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$iris_factors, iris_melt$Species), FUN = sd)
setosa versicolor virginica
Sepal.Length 0.3524897 0.5161711 0.6358796
Sepal.Width 0.3790644 0.3137983 0.3224966
Petal.Length 0.1736640 0.4699110 0.5518947
Petal.Width 0.1053856 0.1977527 0.2746501
Теперь мне не нужно использовать Rbind в принципе.
Добро пожаловать в StackOverflow! Пожалуйста, быстро прочитайте [как спросить] (http://stackoverflow.com/help/how-to-ask) и посмотрите [как сделать воспроизводимый пример] (http://stackoverflow.com/questions/ 5963269/как в изготовлении, а-пре-р-воспроизводимый-пример). Затем вы можете вернуться и изменить свой вопрос, добавив пример и некоторый код, чтобы показать, что вы пробовали, и что-нибудь еще, что поможет прояснить ваш вопрос. – Jota