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")