Я пытаюсь инициализировать data.frame без каких-либо строк. По сути, я хочу указать типы данных для каждого столбца и дать им имена, но в результате не нужно создавать никаких строк.
Лучшее, что я смог сделать, это что-то вроде:
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
Который создает data.frame с единственной строкой, содержащей все нужные мне типы данных и имена столбцов, но также создает бесполезную строку, которую затем необходимо удалить.
Есть лучший способ сделать это?
data.frame
вас есть типизированные столбцы, так что да, если вы хотите инициализировать a,data.frame
вы должны решить тип столбцов ...data.frame
это не ограничивает «примитивность» типов столбцов (например, вы можете добавить столбец дат или даже столбец, содержащий список элементов). Кроме того, этот вопрос не является абсолютной ссылкой, поскольку, например, если вы не укажете правильный тип столбца, вы не будете блокировать дальнейшее добавление строки, имеющей столбец разных типов ... поэтому я добавлю примечание, но не пример со всеми примитивными типами, потому что он не охватывает все возможности ...data.frame(Doubles=rep(as.double(NA),numberOfRow), Ints=rep(as.integer(NA),numberOfRow))
Если у вас уже есть существующий фрейм данных , скажем
df
, с нужными столбцами, вы можете просто создать пустой фрейм данных, удалив все строки:Обратите внимание, что
df
все еще содержит данные, ноempty_df
не содержит.Я нашел этот вопрос в поисках того, как создать новый экземпляр с пустыми строками, поэтому я думаю, что это может быть полезно для некоторых людей.
источник
df[NA,]
это, это также повлияет на индекс (что вряд ли будет тем, что вы хотите), я бы вместо этого использовалdf[TRUE,] = NA
; однако обратите внимание, что это перезапишет оригинал. Сначала вам нужно будет скопироватьcopy_df = data.frame(df)
copy_df[TRUE,] = NA
empty_df
сempty_df[0:nrow(df),] <- NA
.Вы можете сделать это без указания типов столбцов
источник
Вы можете использовать
read.table
пустую строку для вводаtext
следующим образом:Альтернативно, указав в
col.names
виде строки:Спасибо Ричарду Скривену за улучшение
источник
read.table(text = "", ...)
если вам не нужно явно открывать соединение.read.csv
Подход также работает сreadr::read_csv
, как и вread_csv("Date,File,User\n", col_types = "Dcc")
. Таким образом, вы можете напрямую создать пустой столбик необходимой структуры.Наиболее эффективный способ сделать это - использовать
structure
для создания списка, который имеет класс"data.frame"
:Чтобы сравнить это с принятым в настоящее время ответом, вот простой тест:
источник
data.table
обычно содержит.internal.selfref
атрибут, который нельзя подделать без вызоваdata.table
функций. Вы уверены, что не полагаетесь на недокументированное поведение здесь?data.table
и предположил, что Google нашел то, что хотел, и все здесь связаноdata.table
.data.frame()
обеспечивает проверку имен, строк и т. д.Просто объявить
при попытке до
rbind
первой строки будут созданы столбцыисточник
rbind
это будет хорошо, если нет ...rbind()
.Если вы ищете краткость:
поэтому вам не нужно указывать имена столбцов отдельно. Вы получаете логический тип столбца по умолчанию, пока не заполните заполненный фрейм данных.
источник
Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 2
Я создал пустой фрейм данных, используя следующий код
и попытался связать несколько строк, чтобы заполнить так же, как показано ниже.
но он начал давать неправильные имена столбцов следующим образом
Решением этой проблемы является преобразование newrow в тип df следующим образом
теперь дает правильный кадр данных при отображении с именами столбцов, как показано ниже
источник
Чтобы создать пустой фрейм данных , передайте количество необходимых строк и столбцов в следующую функцию:
Чтобы создать пустой фрейм при указании класса каждого столбца , просто передайте вектор нужных типов данных в следующую функцию:
Используйте следующим образом:
Который дает:
Чтобы подтвердить свой выбор, выполните следующее:
источник
Если вы хотите создать пустой data.frame с динамическими именами (имена столбцов в переменной), это может помочь:
Вы также можете изменить типы, если вам это нужно. подобно:
источник
Если вы не против явно указать типы данных, вы можете сделать это следующим образом:
источник
Используя,
data.table
мы можем указать типы данных для каждого столбца.источник
Если вы хотите объявить такое
data.frame
со многими столбцами, возможно, будет сложно набрать все классы столбцов вручную. Особенно, если вы можете использоватьrep
этот подход, он прост и быстр (примерно на 15% быстрее, чем другое решение, которое можно обобщить следующим образом):Если ваши нужные классы столбцов находятся в векторе
colClasses
, вы можете сделать следующее:lapply
приведет к списку желаемой длины, каждый элемент которого представляет собой просто пустой типизированный вектор, напримерnumeric()
илиinteger()
.setDF
преобразует этоlist
путем ссылки наdata.frame
.setnames
добавляет нужные имена по ссылке.Сравнение скорости:
Это также быстрее, чем при использовании
structure
аналогичным способом:источник
Допустим, ваши имена столбцов являются динамическими, вы можете создать пустую матрицу с именем строки и преобразовать ее во фрейм данных.
источник
Этот вопрос не решал конкретно мои проблемы (обрисованные в общих чертах здесь ), но в случае, если кто-то хочет сделать это с параметризованным количеством столбцов и без принуждения:
Как утверждает дивибисан по связанному вопросу,
источник
Если у вас уже есть фрейм данных, вы можете извлечь метаданные (имена и типы столбцов) из фрейма данных (например, если вы управляете БАГОМ, который запускается только с определенными входными данными и вам нужен пустой фиктивный фрейм данных):
А затем использовать
read.table
для создания пустого кадра данныхисточник