Sqldf в R - ошибка с именами первых столбцов

Каждый раз, когда я использую read.csv.sql, я не могу выбрать из первого столбца, и любой вывод кода помещает необычный символ (A (тильда) - ..) в начало имени первого столбца.

Итак, предположим, я создаю файл df.csv в Excel, который выглядит примерно так

df = data.frame(
  a = 1, 
  b = 2, 
  c = 3, 
  d = 4)

Затем, если я использую sqldf для запроса csv, который находится в моем рабочем каталоге, я получаю следующую ошибку:

> read.csv.sql("df.csv", sql = "select * from file where a == 1")
Error in result_create(conn@ptr, statement) : no such column: a

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

df <- read.csv.sql("df.csv", sql = "select * from file where b == 2")
View(df)

Я получаю эту таблицу

Есть идеи, как предотвратить добавление этих символов к имени первого столбца?


person Mark Z    schedule 12.03.2019    source источник
comment
stackoverflow.com/questions/22974765/ Проверить кодировку   -  person Chabo    schedule 13.03.2019
comment
Если это единственная проблема (и вы не можете или не желаете исправить проблему с кодировкой, если это так), вы всегда можете просто перезаписать имена столбцов с помощью colnames(x) <- letters[seq_len(ncol(x))], чтобы получить строчные буквы для всех столбцов. Если у вас их больше 26, вам нужно будет разместить ...   -  person r2evans    schedule 13.03.2019
comment
Спасибо за ответы. Прочитав ссылку, я понял, что именно так я сохранял файл в excel, и, перейдя с CSV UTF-8 на CSV, он удалил символы, и я мог запросить первый столбец как обычно.   -  person Mark Z    schedule 13.03.2019


Ответы (2)


Проблема, по-видимому, в том, что у вас есть файл, размер которого больше, чем может обработать R, и поэтому вы хотите прочитать только подмножество строк в R, и указание условия для его фильтрации включает обращение к первому столбцу, имя которого испорчено, чтобы вы могли не использую это.

Вот два альтернативных подхода. Первый включает немного больше кода, но имеет то преимущество, что он составляет 100% R. Второй - только один оператор и также использует R, но дополнительно использует внешнюю утилиту.

1) пропустить заголовок. Прочтите файл, пропуская заголовок. Это приведет к тому, что столбцы будут помечены V1, V2 и т. Д. И будут использовать V1 в условии.

# write out a test file - BOD is a data frame that comes with R
write.csv(BOD, "BOD.csv", row.names = FALSE, quote = FALSE)

# read file skipping over header
DF <- read.csv.sql("BOD.csv", "select * from file where V1 < 3", 
  skip = 1, header = FALSE)

# read in header, assign it to DF and fix first column
hdr <- read.csv.sql("BOD.csv", "select * from file limit 0")
names(DF) <- names(hdr)
names(DF)[1] <- "TIME"  # suppose we want TIME instead of Time

DF
##   TIME demand
## 1    1    8.3
## 2    2   10.3

2) фильтр. Другой способ продолжить - использовать аргумент filter=. Здесь мы предполагаем, что знаем, что конец имени столбца - ime, но есть другие символы до этого, которые мы не знаем. Это предполагает, что sed доступен и находится на вашем пути. Если вы работаете в Windows, установите Rtools, чтобы получить sed. Цитирование может потребоваться изменить в зависимости от вашей оболочки.

Пробуя это в Windows, я заметил, что sed из Rtools изменили окончания строк, поэтому ниже мы указали eol=, чтобы обеспечить правильную обработку. Возможно, вам это не понадобится.

DF <- read.csv.sql("BOD.csv", "select * from file where TIME < 3", 
  filter = 'sed -e "1s/.*ime,/TIME,/"' , eol = "\n")
DF
##   TIME demand
## 1    1    8.3
## 2    2   10.3
person G. Grothendieck    schedule 12.03.2019
comment
Спасибо за подробный ответ. Я действительно придумал, как полностью убрать персонажей, но я собирался использовать ваши методы, если у меня не получится этого сделать. - person Mark Z; 13.03.2019

Итак, я понял это, прочитав приведенные выше комментарии.

Я нахожусь на компьютере с Windows 10 и использую Excel для Office 365. Специальные символы исчезнут, если я изменил способ сохранения файла с «CSV UTF-8 (с разделителями-запятыми)» на просто «CSV (с разделителями-запятыми)».

person Mark Z    schedule 13.03.2019