R определить размеры пустого фрейма данных - PullRequest
45 голосов
/ 29 марта 2012

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

collect1 <- c()  ## i'd like to create empty df w/ 3 columns: `id`, `max1` and `min1`

for(i in 1:10){
collect1$id <- i
ss1 <- subset(df1, df1$id == i)
collect1$max1 <- max(ss1$value)
collect1$min1 <- min(ss1$value)
}

Я чувствую себя очень глупо, задавая этот вопрос (я почти чувствую, чтоЯ спрашивал об этом раньше, но не могу его найти), но очень признателен за любую помощь.

Ответы [ 11 ]

106 голосов
/ 29 марта 2012

Будет ли работать кадр данных NA с? что-то вроде:

data.frame(matrix(NA, nrow = 2, ncol = 3))

, если вам нужно быть более точным в отношении типа данных, вы можете предпочесть: NA_integer_, NA_real_, NA_complex_ или NA_character_ вместо просто NA, что логично

Что-то еще, что может быть более конкретным, чем NAs:

data.frame(matrix(vector(mode = 'numeric',length = 6), nrow = 2, ncol = 3))

, где режим может быть любого типа. См ?vector

24 голосов
/ 29 марта 2012

Просто создайте фрейм данных с пустыми векторами:

collect1 <- data.frame(id = character(0), max1 = numeric(0), max2 = numeric(0))

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

11 голосов
/ 29 марта 2012

Вы можете сделать что-то вроде:

N <- 10
collect1 <- data.frame(id   = integer(N),
                       max1 = numeric(N),
                       min1 = numeric(N))

Теперь следите за тем, чтобы в остальной части кода вы забыли использовать индекс строки для заполнения строки data.frame построчно. Должно быть:

for(i in seq_len(N)){
   collect1$id[i] <- i
   ss1 <- subset(df1, df1$id == i)
   collect1$max1[i] <- max(ss1$value)
   collect1$min1[i] <- min(ss1$value)
}

Наконец, я бы сказал, что есть много альтернатив для выполнения того, что вы пытаетесь выполнить, некоторые из них были бы намного более эффективными и использовали бы гораздо меньше печатания. Например, вы можете посмотреть на функцию aggregate или ddply из пакета plyr.

9 голосов
/ 10 января 2014

Вы можете использовать NULL вместо NA.Это создает действительно пустой фрейм данных.

5 голосов
/ 07 мая 2015
df = data.frame(matrix("", ncol = 3, nrow = 10)  
3 голосов
/ 07 ноября 2017

Вот решение, если вы хотите пустой фрейм данных с определенным количеством строк и столбцов НЕТ:

df = data.frame(matrix(NA, ncol=1, nrow=10)[-1]
2 голосов
/ 20 июля 2012

Может помочь решение, данное на другом форуме, В основном это: т.е.

Cols <- paste("A", 1:5, sep="")
DF <- read.table(textConnection(""), col.names = Cols,colClasses = "character")

> str(DF)
'data.frame':   0 obs. of  5 variables:
$ A1: chr
$ A2: chr
$ A3: chr
$ A4: chr
$ A5: chr

Вы можете изменить colClasses под свои нужды.

Оригинальная ссылка https://stat.ethz.ch/pipermail/r-help/2008-August/169966.html

1 голос
/ 28 марта 2016

Если доступны только имена столбцов, например:

cnms <- c("Nam1","Nam2","Nam3")

Чтобы создать пустой фрейм данных с указанными выше именами переменных, сначала создайте объект data.frame:

emptydf <- data.frame()

Теперь вызовите нулевой элемент каждого столбца, создавая пустой фрейм данных с заданными именами переменных:

for( i in 1:length(cnms)){
     emptydf[0,eval(cnms[i])]
 }
1 голос
/ 01 февраля 2014

Более общий метод создания фрейма данных произвольного размера состоит в создании фрейма данных n-на-1 из матрицы того же измерения.Затем вы можете сразу же отбросить первый ряд:

> v <- data.frame(matrix(NA, nrow=1, ncol=10))
> v <- v[-1, , drop=FALSE]
> v
 [1] X1  X2  X3  X4  X5  X6  X7  X8  X9  X10
<0 rows> (or 0-length row.names)
0 голосов
/ 28 февраля 2019

Я столкнулся с той же проблемой и нашел более чистое решение. Вместо создания пустого data.frame вы можете сохранить данные в виде именованного списка . После добавления всех результатов в этот список вы преобразуете его в data.frame после.

В случае добавления функций по одному это работает лучше всего.

mylist = list()
for(column in 1:10) mylist$column = rnorm(10)
mydf = data.frame(mylist)

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

mylist = list()
for(row in 1:10) mylist$row = rnorm(10)
mydf = data.frame(do.call(rbind, mylist))

Я не нашел простого способа добавления строк смешанных типов. В этом случае, если вы должны сделать это таким образом, пустой data.frame, вероятно, является лучшим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...