R: распознавание количества столбцов при чтении фрейма данных

Когда команда ниже вводится в R, создается фрейм данных из 11 строк и 5 столбцов (переменных). Мой вопрос: откуда R знает, что в этом наборе данных есть 5 столбцов? Что мешает R создать 1 кадр данных из 55 строк?

Спасибо!

d <- read.table(header=FALSE, fill=TRUE, text="
  1   2010-10-04 52495  2010-10-04 11.6  
  2   2010-10-01 53000  2010-10-01 15.3
  3   2010-09-30 52916  2010-09-30 14.3
  4   2010-09-29 52785  2010-09-29 11.3
  5   2010-09-28 53348  2010-09-28 18.2
  6   2010-09-27 52885  2010-09-24 11.7
  7   2010-09-24 52174  2010-09-23 15.0
  8   2010-09-23 51461  2010-09-22 18.6
  9   2010-09-22 51286  2010-09-20 17.9
  10  2010-09-21 50968  
  11  2010-09-20 49250  ")

3 ответа

Решение

Функция read.table имеет несколько параметров, большинство из них имеют значения по умолчанию, поэтому вам не нужно указывать их. В частности, есть параметр sepкоторый по умолчанию "", Этот параметр делает магию распознавания количества столбцов. Если вы измените свой код на:

data.txt="
  1   2010-10-04 52495  2010-10-04 11.6  
  2   2010-10-01 53000  2010-10-01 15.3
  3   2010-09-30 52916  2010-09-30 14.3
  4   2010-09-29 52785  2010-09-29 11.3
  5   2010-09-28 53348  2010-09-28 18.2
  6   2010-09-27 52885  2010-09-24 11.7
  7   2010-09-24 52174  2010-09-23 15.0
  8   2010-09-23 51461  2010-09-22 18.6
  9   2010-09-22 51286  2010-09-20 17.9
  10  2010-09-21 50968  
  11  2010-09-20 49250  "

# reading the same data with different sep values
d0 <- read.table(header=FALSE, fill=TRUE, text=data.txt)
d1 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep="")
d2 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep=",")
d3 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep=";")
d4 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep="-")
d5 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep="0")
d6 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep=".")

# aggregatting all data frames
d = list(d0=d0, d1=d1, d2=d2, d3=d3, d4=d4, d5=d5, d6=d6)
dims.d = sapply(d, dim) # get the dimension of all dataframes
rownames(dims.d) = c("nrow", "ncol")
print(dims.d)

     d0 d1 d2 d3 d4 d5 d6
nrow 11 11 11 11 11 11 11
ncol  5  5  1  1  5 12  2

Теперь вы видите, что данные читаются по-другому. Все фреймы данных с 5 столбцами совершенно разные, кроме первых двух (вы можете проверить). Почему всегда 11 рядов? Потому что конец строки используется для обозначения начала новой строки. Это хорошая идея, чтобы всегда смотреть на эти параметры по умолчанию, чтобы увидеть, что происходит без нашего явного вмешательства.

read.table а друзья предназначены для чтения табличных данных, то есть ввода, который можно описать как имеющий заданное количество строк и столбцов. Функция выводит строки и столбцы из разделителей и символов новой строки во входных данных, поэтому вы получаете 11 строк и 5 столбцов. Если у вас есть последовательный ввод, то есть просто набор элементов без определенной структуры, используйте scan,

С другой стороны, у вас есть номер строки в этом входе, что подразумевает, что у вас действительно есть табличные данные... не так ли?

Есть 5 столбцов и 11 строк, поэтому вы должны ожидать этого (не удивительно). Например, если вы удаляете первый столбец с 1,2... 11, но сохраняете другие столбцы, а затем переставляете дату с одним столбцом и значениями на другом столбце, то у вас будет 20 строк и 2 столбца.

d <- read.table(header=FALSE, fill=TRUE, text="
          2010-10-04 52495   
          2010-10-01 53000  
          2010-09-30 52916  
          2010-09-29 52785  
          2010-09-28 53348  
          2010-09-27 52885  
          2010-09-24 52174  
          2010-09-23 51461  
          2010-09-22 51286  
          2010-09-21 50968  
          2010-09-20 49250
          2010-10-04 11.6
          2010-10-01 15.3 
          2010-09-30 14.3 
          2010-09-29 11.3 
          2010-09-28 18.2
          2010-09-24 11.7
          2010-09-23 15.0
          2010-09-22 18.6
          2010-09-20 17.9")

Если вы хотите создать 1 строку на 43 столбца, вам нужно поместить все даты и значения в одну строку (в файле скрипта). Примерно так:

d <- read.table(header=FALSE, fill=TRUE, text="2010-10-04 52495 2010-10-01 53000 2010 09 30 52916 2010-09-29 52785 2010-09-28 53348 2010-9-27 52885 2010-09-24 52174 2010-09-23 51461  2010-09-22 51286  2010-09-21 50968 2010-09-20 49250 2010-10-04 11.6 2010-10-01 15.3 2010-09-30 14.3 2010-09-29 11.3 2010-09-28 18.2 2010-09-24 11. 2010-09-23 15.0 2010-09-22 18.6 2010-09-20 17.9")

Для 2 строк на 32 столбца, поместите в 2 строки в сценарии. Что-то вроде этого:

d <- read.table(header=FALSE, fill=TRUE, text="2010-10-04 52495 2010-10-01 53000 2010 09 30 52916 2010-09-29 52785 2010-09-28 53348 2010-9-27 52885 2010-09-24 52174 2010-09-23 51461  2010-09-22 51286  2010-09-21 50968 2010-09-20 49250 2010-10-04 11.6 2010-10-01 15.3 2010-09-30 14.3 2010-09-29 11.3
                2010-09-28 18.2 2010-09-24 11. 2010-09-23 15.0 2010-09-22 18.6 2010-09-20 17.9")
Другие вопросы по тегам