Как выбрать определенный столбец с помощью sqldf, если имя столбца не указано

У меня есть большой файл (data.txt, 35 ГБ) с 3 столбцами. Примерная часть файла будет выглядеть следующим образом:

...   ...    ...
5   701565  8679.56
8   1.16201e+006    3193.18
1   1.16173e+006    4457.85
14  1.16173e+006    4457.85
9   1.77942e+006    7208.73
4   1.78011e+006    8239.88
14  1.78019e+006    8195.57
9   2.00206e+006    8858.55
4   2.00199e+006    7924
...   ...    ...

Я хочу построить гистограмму для 3-го столбца, когда значения во втором столбце находятся в диапазоне от 0 до 50 000.

Затем я хочу сделать еще одну гистограмму, где значения первого столбца находятся в диапазоне от 50 000 до 100 000. И так далее.

Я не знаю, как указать условие для второго столбца с пакетом sqldf, поскольку у меня нет имен столбцов?

Вероятно, должно получиться что-то вроде этого:

sql = "выберите * из файла, где 'column2'> 0 и 'column2'‹ 50000 "

Как я могу выбрать "столбец2"?


person Fabi    schedule 28.10.2016    source источник


Ответы (2)


Поскольку ваши данные не имеют имен столбцов, прочтите данные с помощью header = F.

Затем попробуйте следующий пример sql:

Чтобы читать только те строки, которые удовлетворяют 3-му столбцу ‹5000:

read.csv.sql(file = "test.txt", header = F, sep = " ", sql = "select * from file where v3<5000")

Результат:

  V1      V2      V3
1  8 1162010 3193.18
2  1 1161730 4457.85
3 14 1161730 4457.85

Используйте v2 для фильтрации по столбцу 2.

person R. Schifini    schedule 28.10.2016
comment
Я получаю следующую ошибку: Ошибка в sqliteSendQuery (con, statement, bind.data): error in statement: нет такого столбца: v3 - person Fabi; 28.10.2016
comment
Как вы читаете данные? Вы пробовали прочитать несколько строк и посмотреть, каковы названия столбцов? - person R. Schifini; 28.10.2016
comment
Прочитал тестовый файл. К сожалению, это дает мне только одну колонку. Колонка называется V1. В каждом ряду по три числа. Например. Строка 1: 9 43425,8 0 - person Fabi; 28.10.2016
comment
Кажется, что у вас может быть переменное количество пробелов в качестве разделителей. read.table мог бы справиться с этим хорошо, но похоже, что read.csv.sql нет. Я посмотрю, что мне делать. - person R. Schifini; 28.10.2016
comment
Я думаю, что наличие нескольких пробелов в качестве разделителя приведет к более чем 3 столбцам. @Fabi, вы уверены, что ваш файл не разделен табуляцией? В таком случае используйте sep = '\t'. - person Scarabee; 29.10.2016

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

file <- data.frame(RN1 = runif(10), RN2 = 1:10, RN3 = letters[1:10])
sqldf("select Col2 from 
      (select NULL as Col1, NULL as Col2, NULL as Col3 where 1 = 0 UNION ALL select * from file)")
   Col2
1     1
2     2
3     3
4     4
5     5
6     6
7     7
8     8
9     9
10   10

Используя (select NULL as Col1, NULL as Col2, NULL as Col3 where 1 = 0 UNION ALL select * from file), вы можете изменить имена столбцов в запросе без изменения имен исходных data.frame, поэтому я могу написать столбец с позицией независимо от того, меняются ли имена или неизвестны.

ОБНОВЛЕНИЕ:

Другой более эффективный вариант - получить имя столбца и обратиться к нему по его положению.

sqldf(paste0("select ",
            names(sqldf("select * from file where 1 = 0")[2]),
            " from file"))
   RN2
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  10
person Juan Antonio Roldán Díaz    schedule 12.07.2018