Повторное объединение данных в R - PullRequest
0 голосов
/ 04 июня 2011

Я использовал функцию «Hist» для хранения своих данных в R. Теперь я хотел бы сделать, чтобы у меня была функция Hist, которая не только принимает список значений в корзину, но и значение и количество для каждого из них.,Я написал один в R, чтобы сделать это для меня, но он в 10-50 раз медленнее (очень грубая оценка), чем встроенный хист.

Есть ли способ сделать это «изначально»?

Так, например, может быть список (или вектор) вида (1, 200) (2, 30) (3, 50)

Где первое значение - это значение, а второе -количество экземпляров этих данных (я могу переместить мои данные в другие формы, это только пример)

Спасибо!

Обновление: я (в основном) отображаю непрерывный домен впроизвольная дискретная область.Скажем, у меня есть сто значений от 0 до 10, и я хочу получить вывод, сколько будет между 0 и 1, 1 и 2 и т. Д. (Или между 0 и 2, 2 и 4 или что-то еще).Таким образом, для этой функции прекрасно работает (я говорю, где делить «сегменты»), и она выводит дискретизированные значения (я могу передать флаг, чтобы не рисовать график).

Но что у меня естьТеперь это не просто набор значений от 0 до 10, а набор значений И сколько их экземпляров.Таким образом, вместо того, чтобы иметь 0,1, 0,1, 0,1, 0,1, 0,2, 0,2, 0,5 в качестве 7 различных значений, я получаю его в виде (0,1, 4), (0,2, 2), (0,5, 1), который показывает значения исосчитать.И я хочу иметь возможность запускать функцию «исторических» (или что-то в этом роде) над данными и получать тот же вывод, как если бы он был в «расширенной» форме.

Итак, я написалфункция, чтобы сделать это, но он работает НАМНОГО медленнее, чем первоначальная история.«Развертывание» данных сделает его слишком большим в памяти для того, что мне нужно.

Ответы [ 4 ]

4 голосов
/ 04 июня 2011

Я не уверен, что вы имеете в виду под "группировкой данных", но если я прав, вы готовы получить категории / разрывы, сделанные функцией hist, и сохранить результаты.

Это можетсделать это легко, не вызывая graphics, например:

> table(cut(data, 5))
(-0.000908,0.198]     (0.198,0.397]     (0.397,0.595]     (0.595,0.794] 
               19                20                17                21 
    (0.794,0.993] 
               23 

Данные были созданы для демонстрационных целей data <- runif(100).

В приведенной выше команде cut выполняет основную работу:это сокращает непрерывную переменную к указанному количеству интервалов (выше: это было 5).Я позвонил table, чтобы показать частоты.

1 голос
/ 04 июня 2011

Я мог бы что-то упустить, но я думаю, что это может помочь:

#Generate the data
x <- c(rep(1, 200), rep(2, 30), rep(3, 50))

#Since the midpoints of each bucket will be used and the desired bucket width
#is 1, start the bucket breaks at -0.5
buc <- seq(-0.5, 5, 1)

#Get a histogram using the above bucket breaks
res <- hist(x, breaks=buc)

#Build a data frame with the results
df <- data.frame(mids=res$mids, counts=res$counts)
df

  mids counts
1    0      0
2    1    200
3    2     30
4    3     50
5    4      0

Используйте names, чтобы посмотреть, какие переменные доступны из hist

names(res)

[1] "breaks"      "counts"      "intensities" "density"     "mids"        "xname"       "equidist"  
0 голосов
/ 05 июня 2011

Вместе с другим респондентом, я не совсем уверен, что вы хотите, но я предполагаю, что вы хотите расширение табличного описания большего вектора:

unlist( mapply("rep", x=c(1,2,3), times=c(200,30,50) ) )

  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [34] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [67] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[100] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[133] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[166] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[199] 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3
[232] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[265] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
0 голосов
/ 04 июня 2011

Вы имеете в виду

barplot(height=c(200,30,50),names.arg=1:3,space=0,ylab="Count")

Вы также можете сделать это, взломав ваши данные в формате, возвращаемом hist и вызвав graphics:::plot.histogram, т.е.

## must specify counts, mid, breaks, and specify that the bars are equidistant
h <- list(counts=c(200,30,50),mid=1:3,breaks=seq(0.5,3.5,by=1),equidist=TRUE)
graphics:::plot.histogram(h,freq=TRUE)

edit : Зависит от того, в какой форме находятся ваши данные и насколько вы хотите гибки быть о повторном ведении.

Грубая простая версия, если вы хотите взять существующий набор разрывов, средних точек и счетчиков и объединить каждый набор agg бинов (в вашем примере agg=2):

mids <- seq(0.1,0.6,by=0.1)
breaks <- seq(0.05,0.65,by=0.1)
counts <- c(3,7,6,9,6,7)

agg <- 2
bnames <- apply(matrix(mids,byrow=TRUE,ncol=agg),1,
                      function(x) paste(head(x,1),tail(x,1),sep="-"))
bmids <- rowMeans(matrix(mids,byrow=TRUE,ncol=agg))
bbreaks <- breaks[seq(1,length(breaks),by=agg)]
bcount <- rowSums(matrix(counts,byrow=TRUE,ncol=agg))

h <- list(counts=bcount,mid=bmids,breaks=bbreaks,equidist=TRUE)
graphics:::plot.histogram(h,freq=TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...