2017-02-20 47 views
-1

Как создать несколько сводных статистических данных (среднее значение, sd, диапазон, размер выборки) для нескольких категорий (разные измерения в строке 1) из разных видов (в столбце 1) одновременно и распечатать их, используя «write .csv() в один файл данных. Я могу сделать это достаточно легко, если я делаю это по одному виду за раз, но я хотел бы поместить все данные из всех видов в один. CSV-файл, генерируя статистику сумм одновременно. "Сводная статистика в R

+4

Добро пожаловать в StackOverflow! Пожалуйста, быстро прочитайте [как спросить] (http://stackoverflow.com/help/how-to-ask) и посмотрите [как сделать воспроизводимый пример] (http://stackoverflow.com/questions/ 5963269/как в изготовлении, а-пре-р-воспроизводимый-пример). Затем вы можете вернуться и изменить свой вопрос, добавив пример и некоторый код, чтобы показать, что вы пробовали, и что-нибудь еще, что поможет прояснить ваш вопрос. – Jota

ответ

1

Я знаю, о чем вы говорите. Предположим, вы хотите получить среднее, стандартное отклонение, диапазон и размер выборки. Поскольку 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") 
+0

Большое спасибо. Я могу получить все эти данные для каждого вида отдельно, но когда я хочу, чтобы эти данные для кратных видов в одной и той же матрице данных (CSV-файл), я хотел бы делать их все за раз, а не разрезать матрицу на отдельные виды матрицы данных для запуска отдельно. Есть ли для этого сценарий? –

0

Я думал о моем ответе, который я дал обратно в тот же день, и я подумал, что это могло бы быть лучше, когда я понял, что 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 в принципе.