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)
}
Я чувствую себя очень глупым, задавая этот вопрос (я почти чувствую, что я спрашивал об этом раньше, но не могу его найти), но очень признателен за любую помощь.
Ответы
Ответ 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]