R définir les dimensions du bloc de données vide

J’essaie de collecter des données de plusieurs sous-ensembles d’un dataset et de créer un bloc de données pour collecter les résultats. Mon problème est de ne pas savoir comment créer un bloc de données vide avec un nombre défini de colonnes sans avoir réellement des données à y mettre.

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

Je me sens très bête en posant cette question (j’ai presque l’impression de l’avoir posée sur SO avant mais je ne la trouve pas) mais j’apprécierais grandement toute aide.

Créez simplement un bloc de données de vecteurs vides:

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

Mais si vous savez combien de lignes vous aurez à l'avance, vous devez simplement créer le bloc de données avec autant de lignes pour commencer.

Une firebase database de NA fonctionnera-t-elle? quelque chose comme:

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

Si vous avez besoin d’être plus précis sur le type de données, alors vous pouvez préférer: NA_integer_ , NA_real_ , NA_complex_ ou NA_character_ au lieu de simplement NA qui est logique

Autre chose qui pourrait être plus spécifique que les NAs :

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

où le mode peut être de tout type. Voir ?vector

Vous pouvez faire quelque chose comme:

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

Maintenant, faites attention que dans le rest de votre code, vous avez oublié d'utiliser l'index de ligne pour remplir la ligne data.frame ligne par ligne. CA devrait etre:

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

Enfin, je dirais qu’il ya beaucoup d’alternatives pour faire ce que vous essayez d’accomplir, certaines seraient beaucoup plus efficaces et utiliseraient beaucoup moins de frappe. Vous pouvez par exemple examiner la fonction d' aggregate , ou ddply partir du package plyr .

Vous pouvez utiliser NULL au lieu de NA . Cela crée un bloc de données vraiment vide.

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

Cela pourrait aider la solution donnée dans un autre forum, Fondamentalement, c’est:

 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 

Vous pouvez modifier les classes de couleur selon vos besoins.

Le lien original est https://stat.ethz.ch/pipermail/r-help/2008-August/169966.html

Une méthode plus générale pour créer une trame de données de taille arbitraire consiste à créer une trame de données n par 1 à partir d’une masortingce de même dimension. Ensuite, vous pouvez immédiatement déposer la première ligne:

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

Voici une solution si vous voulez un bloc de données vide avec un nombre défini de lignes et de colonnes NO:

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

Si seuls les noms de colonne sont disponibles comme:

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

Pour créer un bloc de données vide avec les noms de variable ci-dessus, créez d'abord un object data.frame :

 emptydf <- data.frame() 

Appelez maintenant l'élément zeroth de chaque colonne, créant ainsi un bloc de données vide avec les noms de variable donnés:

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

seq_along peut vous aider à déterminer le nombre de lignes de votre fichier de données et à créer un fichier data.frame avec le nombre de lignes souhaité

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