Как вычислить описательную статистику для набора векторов разного размера - PullRequest
4 голосов
/ 13 июля 2010

В задаче у меня есть набор векторов.Каждый вектор имеет показания датчика, но разной длины.Я хотел бы рассчитать одну и ту же описательную статистику по каждому из этих векторов.Мой вопрос, как мне хранить их в R. Использование c() объединяет векторы.Использование list() может привести к неправильной работе таких функций, как mean().Является ли фрейм данных правильным объектом?

Какова наилучшая практика применения одной и той же функции к векторам, если они имеют разные размеры?Предположим, что данные находятся на сервере SQL, как они должны быть импортированы?

Ответы [ 4 ]

7 голосов
/ 13 июля 2010

Векторы разных размеров должны быть объединены в список: data.frame ожидает, что каждый столбец будет одинаковой длины.

Используйте lapply для получения ваших данных. Затем снова используйте lapply, чтобы получить описательную статистику.

x <- lapply(ids, sqlfunction)
stats <- lapply(x, summary)

Где sqlfunction - некоторая функция, созданная вами для запроса вашей базы данных. Вы можете свернуть список stats в data.frame, вызвав do.call(rbind, stats) или используя plyr:

library(plyr)
x <- llply(ids, sqlfunction)
stats <- ldply(x, summary)
2 голосов
/ 24 декабря 2010

Большинство функций построения графиков и регрессии ожидают, что данные будут иметь «длинный» формат: числовые значения в одном столбце и группирование или ковариацию значений в других. Функция стека будет принимать списки неправильной длины, а tapply или агрегат позволят функциям работать с переменными категории неправильной длины:

dlist <- list(a=1:2, b=13:15, cc= 5:1)
s.dfrm <- stack(dlist)
s.dfrm
   values ind
1       1   a
2       2   a
3      13   b
4      14   b
5      15   b
6       5  cc
7       4  cc
8       3  cc
9       2  cc
10      1  cc
tapply(s.dfrm$values, s.dfrm$ind, mean)
   a    b   cc 
 1.5 14.0  3.0 
1 голос
/ 13 июля 2010

Я бы хотел импортировать это во фрейм данных, а не в список. Каждый из ваших отдельных векторов, вероятно, дифференцирован одной или несколькими значимыми переменными. Допустим, вы хотели отслеживать время сбора данных и их местоположение. В кадре данных у вас будет один столбец, в котором все векторы объединены вместе, но каждый из них будет дифференцирован по значениям в столбцах времени и местоположения. Чтобы получить значение каждого отдельного вектора, можно использовать tapply ().

tapply(df$y, list(df$time, df$location), mean)

Или, возможно, aggregate () будет еще лучше, в зависимости от количества переменных и ваших будущих потребностей.

1 голос
/ 13 июля 2010

«Как лучше всего применять одну и ту же функцию к векторам, если они имеют разные размеры? Предположим, данные хранятся на сервере SQL, как их следует импортировать?»

Как подсказывает Шейн, lappy - это вашОпределенный выбор здесь.Вы можете, конечно, использовать его и с пользовательскими функциями - в случае, если вы чувствуете, что резюме не дает достаточно информации.

Для части SQL: существуют пакеты для большинства реляционных СУБД: RPostgreSQL, RMySQL, ROracle и RODBC в целом.Если вы говорите о сервере MS SQL, я не уверен, есть ли конкретный пакет, но RODBC должен сделать эту работу.Я не знаю, состоите ли вы в браке с MS SQL server, но есть ли у вас возможность запустить собственную локальную базу данных для R - RMySQL действительно легко настроить.

В целом, используя пакеты баз данных, вы используете оболочки, такие как dbListTable или dbReadTable, которые просто превращают таблицу в R data.frame.

Если вы действительно хотите импортировать данные, вы можете использовать .csv экспорт вашей базы данных и использовать read.table или read.csv в зависимости от того, что соответствует вашим потребностям.Но я предлагаю напрямую подключиться к базе данных - это не так сложно, даже если вы не делали этого раньше, и это веселее.

РЕДАКТИРОВАТЬ: я не использую MS, но другие делали это раньшевозможно сообщение в списке рассылки помогает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...