2015-10-02 2 views
0

Я использую функцию binning из пакета sm, чтобы взять построенные координаты x, y и поместить их в отдельные ячейки. Это создает частотную таблицу, в которой количество бит определяется путем ввода пользователем SampleSize.Преобразование таблицы в список значений

num_bins <- max(x_max,y_max)/SampleSize 
    bin_breaks <- matrix(c(bins,bins), num_bins+1,2) 
    frequency <- binning(combo_points,breaks=bin_breaks,nbins=num_bins)$table.freq 

Вывод моей таблицы «частоты» в формате ...

 x1 x2 x3 x4 x5... 
    y1 0 5 
    y2 0 
    y3 0 
    y4 
    y5 
    . 
    . 
    . 

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

x y count 
    1 1 0 
    1 2 0 
    1 3 0 
    2 1 5 
    . . . 
    . . . 

Я хочу преобразовать эту таблицу в список data.frame из x, y, count, где x и y теперь действительно являются только координатой x, y самого бина. В настоящее время я делаю это, создавая файл data.frame, чтобы перечислить координаты bin (freq_points $ x и freq_points $ y), а затем запустить цикл for, который ищет данные в таблице, которые соответствуют значениям для каждой строки my freq_points data.frame для создания нового вектора (z), для которого каждая итерация цикла for добавляется ... но с более чем 3,4 миллионами ящиков этот процесс занимает несколько часов.

for (i in 1:length(frequency)){ 
    z<-append(z,frequency[freq_points$y[i],freq_points$x[i]])} 

Может кто-то порекомендовать более элегантное решение? Есть ли более прямой способ конвертировать из таблицы в список? Я очень новичок в R, возможно, я неправильно использую термины «таблица» и «список». Я надеюсь, что приведенные выше форматы помогут прояснить мой вопрос.

выход из «dput (частоты)» output from 'dput(frequency)'

У меня были некоторые проблемы при применении ответ ниже моих данных, которые не имеют x1, x2, y1, y2, так как фактические строки и заголовков столбцов имен. Я использовал их, чтобы попытаться понять, но, похоже, вызвало больше путаницы. Для этого прошу прощения. Переход с небольшой матрицей, предоставляемой @neerajt ... Я не понимаю результат и почему подсчитываются count.1, count.2 и count.3. Ни один из столбцов «count» не может использоваться с координатами x, y. Не могли бы вы пролить свет на это?

freq <- matrix(c(0,0,1,5,0,1,1,0,1,1,1,0),nrow=4,ncol=3) 
    freq 
     [,1] [,2] [,3] 
    [1,] 0 0 1 
    [2,] 0 1 1 
    [3,] 1 1 1 
    [4,] 5 0 0 

    counts <- unlist(freq) 
    xname <- rep(c(1:ncol(freq)),nrow(freq)) 
    yname <- rep(c(1:nrow(freq)),ncol(freq)) 
    z <- data.frame(x=xname, y=yname, count=counts, row.names=NULL) 
    z 
     x y count.1 count.2 count.3 
    1 1 1  0  0  1 
    2 2 2  0  1  1 
    3 3 3  1  1  1 
    4 1 4  5  0  0 
    5 2 1  0  0  1 
    6 3 2  0  1  1 
    7 1 3  1  1  1 
    8 2 4  5  0  0 
    9 3 1  0  0  1 
    10 1 2  0  1  1 
    11 2 3  1  1  1 
    12 3 4  5  0  0 
+1

можете ли вы 'dput' частоту – Ananta

+1

вы пробовали' as.data.frame (frequency) '? – MichaelChirico

+0

as.data.frame не изменил структуру данных из таблицы на 3-столбцовый (x, y, z) data.frame. – braxtonlewis

ответ

0

Таблица выходных частот из операции «binning» создала таблицу, которая НЕ является файлом data.frame, поэтому использование функции unlist() не будет работать должным образом, пока не будет применено ее как .data.frame (частота).

xname <- rep(1:ncol(frequency),times=1,each=nrow(frequency)) 
yname <- rep(1:nrow(frequency),times=ncol(frequency),each=1) 
z <- unlist(as.data.frame(frequency)) 
df <- data.frame(x=xname, y=yname, z=count) 

Кроме того, обратите внимание, что функция Репликация в соответствии с предложением @neerajt, необходимых для включения «каждый» функцию для того, чтобы создать правильный х, у координат списки, таким образом, что она будет соответствовать слову «unlist() 'подготовил данные счета как вектор.

unlist() предоставил ключ времени поворота времени вычислений в считанные секунды. Спасибо всем за помощь.

0

Здесь вы можете попробовать. Если у вас есть freq таблицу, которая выглядит следующим образом:

freq = data.frame(x1=c(0,0,1,5), x2=c(0,1,1,0), x3=c(1,1,1,0)) 
row.names(freq) <- c("y1", "y2", "y3", "y4") 

x1 x2 x3 
y1 0 0 1 
y2 0 1 1 
y3 1 1 1 
y4 5 0 0 

Тогда

counts = unlist(freq) 

xname = rep(names(freq), nrow(freq)) 

yname = rep(row.names(freq), length(freq)) 

z = data.frame(x = xname, y = yname, count = counts, row.names=NULL) 

z вернется

x y count 
1 x1 y1  0 
2 x2 y2  0 
3 x3 y3  1 
4 x1 y4  5 
5 x2 y1  0 
6 x3 y2  1 
7 x1 y3  1 
8 x2 y4  0 
9 x3 y1  1 
10 x1 y2  1 
11 x2 y3  1 
12 x3 y4  0 

Надеется, что поможет вам закрыть , Основной вынос - операция unlist().

Когда дело доходит до терминологии, обе таблицы, или более конкретно data.frames в R. Разница ваша исходная таблица (frequency) в широком формате, а стол вы собираетесь (z) является длинный формат. This article хорошо иллюстрирует идею.

Смежные вопросы