структура data.frame fubar: структура говорит о большинстве символов, печать говорит только о некоторых

Я использую sqldf для подмножества огромного файла. Следующая команда дает мне data.frame из 100 строк и 42 столбцов.

first <- read.csv.sql("first.txt", sep = " ", header = TRUE, row.names = FALSE,
        sql = "SELECT * FROM file WHERE n = '\"n63\"' AND ratio = 1 AND r_name = '\"r1\"' AND method = '\"nearest\"' AND variables = 10")

Структура объекта

'data.frame':   100 obs. of  42 variables:
 $ test_before       : chr  "TRUE" "TRUE" "TRUE" "TRUE" ...
 $ test_after        : chr  "TRUE" "TRUE" "TRUE" "TRUE" ...
 $ meanPSmatchRATIO  : chr  "1.54845330373635" "1.16857102212364" "1.25330045961256" "1.8011651466717" ...
snipped intervening normally printed columns
 $ PSdiff_DIFF       : chr  "-0.0103938442562762" "-0.00935228868105753" "-0.00947571480267878" 
snipped intervening normally printed columns
 $ nUNMATCHt         : chr  "0" "0" "0" "0" ...
 $ caliper           : chr  "\"no\"" "\"no\"" "\"no\"" "\"no\"" ...
 $ method            : chr  "\"nearest\"" "\"nearest\"" "\"nearest\"" "\"nearest\"" ...
 $ r_name            : chr  "\"r1\"" "\"r1\"" "\"r1\"" "\"r1\"" ...
 $ ratio             : int  1 1 1 1 1 1 1 1 1 1 ...
 $ n                 : chr  "\"n63\"" "\"n63\"" "\"n63\"" "\"n63\"" ...
 $ variables         : int  10 10 10 10 10 10 10 10 10 10 ...

Теперь, исходя из этого, вы ожидаете, что когда я печатаю data.frame, все столбцы (кроме тех, что int будут символьными (заключенными в "")). Но ты ошибаешься!

  test_before test_after meanPSmatchRATIO del-  nUNMATCHt caliper    method r_name ratio     n variables
1        TRUE       TRUE 1.54845330373635 eted          0    "no" "nearest"   "r1"     1 "n63"        10
2        TRUE       TRUE 1.16857102212364 ...           0    "no" "nearest"   "r1"     1 "n63"        10
3        TRUE       TRUE 1.25330045961256 ...           0    "no" "nearest"   "r1"     1 "n63"        10
4        TRUE       TRUE  1.8011651466717 ...t          0    "no" "nearest"   "r1"     1 "n63"        10

Обратите внимание, что только последние несколько столбцов являются «символьными». Я немного потерян в том, что происходит. Может кто-нибудь объяснить?


person Roman Luštrik    schedule 11.09.2011    source источник
comment
Я не уверен, что ты имеешь в виду. Отсутствие кавычек кажется мне нормальным при отображении фреймов данных на консоли. Он будет цитировать элементы, если я проверю один столбец, но не весь фрейм данных.   -  person joran    schedule 11.09.2011
comment
str утверждает, что большинство столбцов являются символьными. Включая суппорт, метод, r_name и n. Однако только вышеупомянутые столбцы печатаются с ", все остальные ведут себя как факторные или числовые (или, как в случае с первыми двумя столбцами, логические).   -  person Roman Luštrik    schedule 11.09.2011
comment
В эти столбцы встроены ". Первым элементом caliper является "\"no\""!   -  person Gavin Simpson    schedule 11.09.2011
comment
Я отредактировал вывод str(...) так, чтобы по крайней мере следующий читатель мог сразу увидеть важные биты. (Аналогичная операция над объектом сделала бы этот пример более минимальным, когда он был напечатан.)   -  person IRTFM    schedule 11.09.2011


Ответы (2)


Выглядит хорошо для меня. print.data.frame обычно не печатает кавычки для символьных столбцов, но последние несколько столбцов имеют встроенные кавычки, поэтому по умолчанию они появляются "в кавычках".

Data <- data.frame(x=1:5,y=as.character(1:5),
  z=letters[1:5], q=paste("\"",letters[1:5],"\"",sep=""))
print(Data)  # default print
#   x y z   q
# 1 1 1 a "a"
# 2 2 2 b "b"
# 3 3 3 c "c"
# 4 4 4 d "d"
# 5 5 5 e "e"
print(Data, quote=TRUE)  # show embedded quotes
#     x   y   z       q
# 1 "1" "1" "a" "\"a\""
# 2 "2" "2" "b" "\"b\""
# 3 "3" "3" "c" "\"c\""
# 4 "4" "4" "d" "\"d\""
# 5 "5" "5" "e" "\"e\""
person Joshua Ulrich    schedule 11.09.2011

Вы видите поведение по умолчанию метода print для объектов фрейма данных. См. ?print.data.frame, в котором есть:

   quote: logical, indicating whether or not entries should be printed
          with surrounding quotes.

поэтому, если вы хотите, чтобы печатный объект был заключен в кавычки, используйте quote = TRUE. Например.:

> dat <- data.frame(X = c("A","B"), Y = c("1","2"), stringsAsFactors = FALSE)
> dat
  X Y
1 A 1
2 B 2
> dat[,1] ## not using the data frame print method...
[1] "A" "B"
> print(dat, quote = TRUE)
    X   Y
1 "A" "1"
2 "B" "2"

Изменить: что касается комментария @Roman, столбцы, печатающие с кавычками, содержат встроенные кавычки в данные. Например, первым элементом caliper является "\"no\"", поэтому печатаются встроенные кавычки, что полностью соответствует поведению print.data.frame() по умолчанию.

person Gavin Simpson    schedule 11.09.2011