Лучшая структура данных R для возврата значений таблицы - PullRequest
0 голосов
/ 26 сентября 2011

Следующая функция возвращает data.frame с двумя столбцами:

fetch_count_by_day=function(con){
  q="SELECT t,count(*) AS count FROM data GROUP BY t"
  dbGetQuery(con,q)    #Returns a data frame
}

t является столбцом DATE, поэтому вывод выглядит следующим образом:

       t       count(*)
1 2011-09-22     1438
...

Все, что мне действительно интересноесли какие-либо записи на данную дату уже существуют;но я также буду использовать счет как проверку работоспособности.

В C ++ я бы вернул std::map<std::string,int> или std::unordered_map<std::string,int> (*).В PHP я бы использовал ассоциативный массив с датой в качестве ключа.

Какова лучшая структура данных в R?Это 2-колоночный data.frame?Моей первой мыслью было превратить столбец t в имена строк:

...
d=dbGetQuery(con,q)
rownames(d)=d[,1]
d$t=NULL

Но имена строк data.frame не уникальны, поэтому концептуально они не совсем подходят.Я также не уверен, ускоряет ли это использование.

(Любое и все определения «лучший»: самый быстрый, наименьший объем памяти, ясность кода, наименьший сюрприз для опытных разработчиков R и т. Д.одно решение для всех, если нет, то я хотел бы понять компромиссы и когда выбирать каждую альтернативу.)

*: (для C ++) Если бенчмаркинг показал, что это было узким местом, я мог бы преобразоватьукажите дату в формате YYYYMMDD и используйте std::unordered_map<int,int>;зная, что данные охватывают только несколько лет, я мог бы даже использовать блок памяти с одним целым числом в день между min(t) и max(t) (оборачивая все это в класс).

1 Ответ

2 голосов
/ 26 сентября 2011

Таблицы сопряженности на самом деле являются массивами (или матрицами) и могут быть очень легко созданы. Димны содержат значения, а массив / матрица в своем «ядре» содержит данные подсчета. Функции «table» и «tapply» являются естественными создателями. Вы получаете доступ к счетам с помощью «[» и используете dimnames (), за которым следует «[», чтобы получить имена строк и столбцов. Я бы сказал, что было бы разумнее использовать класс «Дата» для дат, чем сохранять в «символьных» векторах.

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