фактор с 6 уровнями из непрерывной переменной

У меня есть непрерывная переменная частоты, которая колеблется от 0 до 6,115053. Мне нужно разделить это на 6 уровней, так мой анализ будет более читабельным.

Я пытался:

frequency.new <-  hist(all$frequency, 6, plot = FALSE)
all$frequency <- as.factor(frequency.new)

но я получаю ошибку, которую я не понимаю:

Error in sort.list(y) : 
  'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

Кто-нибудь может мне помочь?

Большое спасибо!

Катерина


person Katerina    schedule 02.09.2011    source источник


Ответы (1)


Вы должны посмотреть на функцию cut() в базе R. Вы также должны отметить последнюю строку моего ответа (выделена жирным шрифтом), прежде чем рисковать дальше.

> set.seed(42)
> cut(runif(50), 6)
 [1] (0.825,0.99]    (0.825,0.99]    (0.167,0.332]   (0.825,0.99]   
 [5] (0.496,0.661]   (0.496,0.661]   (0.661,0.825]   (0.00296,0.167]
 [9] (0.496,0.661]   (0.661,0.825]   (0.332,0.496]   (0.661,0.825]  
[13] (0.825,0.99]    (0.167,0.332]   (0.332,0.496]   (0.825,0.99]   
[17] (0.825,0.99]    (0.00296,0.167] (0.332,0.496]   (0.496,0.661]  
[21] (0.825,0.99]    (0.00296,0.167] (0.825,0.99]    (0.825,0.99]   
[25] (0.00296,0.167] (0.496,0.661]   (0.332,0.496]   (0.825,0.99]   
[29] (0.332,0.496]   (0.825,0.99]    (0.661,0.825]   (0.661,0.825]  
[33] (0.332,0.496]   (0.661,0.825]   (0.00296,0.167] (0.825,0.99]   
[37] (0.00296,0.167] (0.167,0.332]   (0.825,0.99]    (0.496,0.661]  
[41] (0.332,0.496]   (0.332,0.496]   (0.00296,0.167] (0.825,0.99]   
[45] (0.332,0.496]   (0.825,0.99]    (0.825,0.99]    (0.496,0.661]  
[49] (0.825,0.99]    (0.496,0.661]  
6 Levels: (0.00296,0.167] (0.167,0.332] (0.332,0.496] ... (0.825,0.99]

cut() возвращает коэффициент, указывающий, к какой из 6 групп, в данном случае, относятся наблюдаемые данные. Это простое разбиение диапазона данных на 6 групп с равным интервалом. Прочтите ?cut для получения подробной информации о том, что делать в крайних точках интервалов.

Причина, по которой ваш код не работает, заключается в том, что объект, возвращаемый hist(), представляет собой список, содержащий гораздо больше, чем ваши данные, разбитые на группы:

> foo <- hist(runif(50), breaks = 6, plot = FALSE)
> str(foo)
List of 7
 $ breaks     : num [1:6] 0 0.2 0.4 0.6 0.8 1
 $ counts     : int [1:5] 12 13 7 13 5
 $ intensities: num [1:5] 1.2 1.3 0.7 1.3 0.5
 $ density    : num [1:5] 1.2 1.3 0.7 1.3 0.5
 $ mids       : num [1:5] 0.1 0.3 0.5 0.7 0.9
 $ xname      : chr "runif(50)"
 $ equidist   : logi TRUE
 - attr(*, "class")= chr "histogram"

поэтому вы не можете просто преобразовать это в коэффициент - R не знает, как это сделать. Также обратите внимание, что hist() не возвращает данные, разбитые на 6 групп, — он предоставляет другую информацию, полезную для построения гистограммы. Также обратите внимание, что в отличие от cut() он будет создавать красивые разрывы. Если вам нужны эти красивые перерывы, то мы можем воспроизвести то, что делает hist():

> set.seed(42)
> x <- runif(50)
> brks <- pretty(range(x), n = 6, min.n = 1)
> cut(x, breaks = brks)
 [1] (0.8,1]   (0.8,1]   (0.2,0.4] (0.8,1]   (0.6,0.8] (0.4,0.6] (0.6,0.8]
 [8] (0,0.2]   (0.6,0.8] (0.6,0.8] (0.4,0.6] (0.6,0.8] (0.8,1]   (0.2,0.4]
[15] (0.4,0.6] (0.8,1]   (0.8,1]   (0,0.2]   (0.4,0.6] (0.4,0.6] (0.8,1]  
[22] (0,0.2]   (0.8,1]   (0.8,1]   (0,0.2]   (0.4,0.6] (0.2,0.4] (0.8,1]  
[29] (0.4,0.6] (0.8,1]   (0.6,0.8] (0.8,1]   (0.2,0.4] (0.6,0.8] (0,0.2]  
[36] (0.8,1]   (0,0.2]   (0.2,0.4] (0.8,1]   (0.6,0.8] (0.2,0.4] (0.4,0.6]
[43] (0,0.2]   (0.8,1]   (0.4,0.6] (0.8,1]   (0.8,1]   (0.6,0.8] (0.8,1]  
[50] (0.6,0.8]
Levels: (0,0.2] (0.2,0.4] (0.4,0.6] (0.6,0.8] (0.8,1]

Но вы должны спросить себя, почему вы хотите так дискретизировать свои данные и имеет ли это смысл?

person Gavin Simpson    schedule 02.09.2011
comment
Спасибо @Aaron - я был в раздумьях, чтобы даже предложить ответ. Я думаю, что я собираюсь подчеркнуть последний комментарий! :-) - person Gavin Simpson; 02.09.2011
comment
Что ж, это может быть разумно, особенно как часть объяснения более сложного анализа, но поскольку трудно сказать, что имеет в виду ОП, я думаю, хорошо, что вы включили совет о том, имеет ли это смысл. - person Aaron left Stack Overflow; 02.09.2011