Составление таблицы частот

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
ymr3R9Jge
Активный участник
Сообщения: 117
Зарегистрирован: 31 окт 2011, 00:18
Репутация: 14
Откуда: Кривий Ріг

Составление таблицы частот

Сообщение ymr3R9Jge » 28 дек 2012, 18:15

Есть вектор чисел (NUMERIC) длиной несколько тысяч записей. Стоит задача составить таблицу частот с заданным шагом: например, с шагом в единицу вычислить сколько значений из исходного вектора попадает в каждый из интервалов. Функция stem выдаёт непонятное месиво цифр.
STEM_RStudio.png
STEM_RStudio.png (94.05 КБ) 7728 просмотров

Иван Стрельников
Интересующийся
Сообщения: 40
Зарегистрирован: 11 авг 2011, 13:23
Репутация: 15

Re: Составление таблицы частот

Сообщение Иван Стрельников » 28 дек 2012, 20:49

Если я правильно понял вопрос, то могу предложить такое решение:
Сначала построить вектор с границами интервалов. Для этого стандартно используется функция seq().
Пусть вектор с данными -- А, тогда границы интервалов -- B<-seq(min(A),max(А),by=y), где y -- величина интервала. Тогда таблицу частот можно получить следующим образом: С<-table(cut(A,B)).
Так же можно предложить функцию, с более привычным выводом результатов:
count.f<-function(x,y){
A<-seq((round(min(x))-y),(round(max(x))+y),by=y)
B<-table(cut(x,A))
B<-as.numeric(B)
A1<-paste(A[c(1:(length(A))-1)],A[c(2:(length(A)))],sep="-")
C<-data.frame(bound=A1,freq=B)
C
}

Здесь x -- Ваш вектор, а y -- величина интервала.
Надеюсь помог.

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Составление таблицы частот

Сообщение gamm » 29 дек 2012, 04:40

ymr3R9Jge писал(а):Есть вектор чисел (NUMERIC) длиной несколько тысяч записей. Стоит задача составить таблицу частот с заданным шагом: например, с шагом в единицу вычислить сколько значений из исходного вектора попадает в каждый из интервалов. Функция stem выдаёт непонятное месиво цифр.
1) stem выдает представление гистограммы, рассчитанное на алфавитно-цифровые принтеры :mrgreen:
Там все понятно, до "палки" - целые, после палки - десятичные, т.е. интервалы с шагом 0.1
2) для вашей задачи придумана гистограмма hist(my.data,plot=FALSE,breaks=seq(0,100,by=1.0))

Код: Выделить всё

x<-runif(1000,10,20)
x.hist<-hist(x,breaks=seq(10,20,by=1),plot=FALSE)

# смотрим содержимое, читаем про него в справочнике ...
?hist
str(x.hist) 
List of 7
 $ breaks     : num [1:11] 10 11 12 13 14 15 16 17 18 19 ...
 $ counts     : int [1:10] 118 101 106 113 92 102 89 104 85 90
 $ intensities: num [1:10] 0.118 0.101 0.106 0.113 0.092 0.102 0.089 0.104 0.085 0.09
 $ density    : num [1:10] 0.118 0.101 0.106 0.113 0.092 0.102 0.089 0.104 0.085 0.09
 $ mids       : num [1:10] 10.5 11.5 12.5 13.5 14.5 15.5 16.5 17.5 18.5 19.5
 $ xname      : chr "x"
 $ equidist   : logi TRUE
 - attr(*, "class")= chr "histogram"

# границы интервалов и полученные счетчики
cbind(x.hist$breaks[-length(x.hist$breaks)],x.hist$breaks[-1],x.hist$counts)
      [,1] [,2] [,3]
 [1,]   10   11  118
 [2,]   11   12  101
 [3,]   12   13  106
 [4,]   13   14  113
 [5,]   14   15   92
 [6,]   15   16  102
 [7,]   16   17   89
 [8,]   17   18  104
 [9,]   18   19   85
[10,]   19   20   90
P.S. из help: Instead of table(cut(x, br)), hist(x, br, plot = FALSE) is more efficient and less memory hungry. Instead of cut(*, labels = FALSE), findInterval() is more efficient.

ymr3R9Jge
Активный участник
Сообщения: 117
Зарегистрирован: 31 окт 2011, 00:18
Репутация: 14
Откуда: Кривий Ріг

Re: Составление таблицы частот

Сообщение ymr3R9Jge » 03 янв 2013, 01:09

Нашёл ещё один вариант решения - использование связки функций table и as.data.frame:

Код: Выделить всё

>chastost<- as.data.frame(table(kompozit_2M$FE_TOTAL))
В результате получаем таблицу данных (data frame) со столбцами, в которых указаны значения и соответствующие им частоты.

Аватара пользователя
Игорь Черниенко
Активный участник
Сообщения: 137
Зарегистрирован: 28 мар 2009, 01:05
Репутация: 11
Откуда: Хабаровск, Южно-Сахалинск

Re: Составление таблицы частот

Сообщение Игорь Черниенко » 03 янв 2013, 04:10

Так ведь если группировать не нужно, то
>chastost<- aggregate(x=kompozit_2M$FE_TOTAL,by=list(kompozit_2M$FE_TOTAL),FUN=length)

Аватара пользователя
Игорь Черниенко
Активный участник
Сообщения: 137
Зарегистрирован: 28 мар 2009, 01:05
Репутация: 11
Откуда: Хабаровск, Южно-Сахалинск

Re: Составление таблицы частот

Сообщение Игорь Черниенко » 03 янв 2013, 04:21

Если нужна табличка с частотами, то, пользуясь примером gamm

> x<-runif(1000,10,20)
> x.hist<-hist(x,breaks=seq(10,20,by=1),plot=FALSE)
> br<-x.hist$breaks
> cts<-x.hist$counts
> n<-length(br)
> x.group<-data.frame(iv=paste(br[1:n-1],'-',br[2:n]),N=cts)

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Составление таблицы частот

Сообщение gamm » 03 янв 2013, 13:10

ymr3R9Jge писал(а):Нашёл ещё один вариант решения - использование связки функций table и as.data.frame:

Код: Выделить всё

>chastost<- as.data.frame(table(kompozit_2M$FE_TOTAL))
В результате получаем таблицу данных (data frame) со столбцами, в которых указаны значения и соответствующие им частоты.
не, не соответствует первоначальной задаче. Считает не попадание в интервалы с произвольными вещественными границами, а уникальные значения. Годится только для категориальных переменных.

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 29 гостей