Подтвердить что ты не робот

R определяют размеры пустого кадра данных

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Будет ли работать с DataFrame 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

Ответ 3

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

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.

Ответ 4

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

Ответ 5

df = data.frame(matrix("", ncol = 3, nrow = 10)  

Ответ 6

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

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

Ответ 7

Более общий способ создания кадра данных произвольного размера - создать кадр данных n-by-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)

Ответ 8

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

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

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

emptydf <- data.frame()

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

for( i in 1:length(cnms)){
     emptydf[0,eval(cnms[i])]
 }

Ответ 9

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

    listdf <- data.frame(ID=seq_along(df),
                              var1=seq_along(df), var2=seq_along(df))

Ответ 10

Здесь решение, если вам нужен пустой фрейм данных с определенным количеством строк и столбцами NO:

df = data.frame(matrix(NA, ncol=1, nrow=10)[-1]