2 votes

Comment ajouter un entier à un dataframe existant de longueur de colonne différente dans r ?

Désolé si cette question a déjà été posée. Je suis nouveau sur R.

J'ai actuellement un dataframe avec 1 colonne. J'essaie de construire ce cadre de données avec les différents entiers que j'ai.

Apeaks
1
6
5

J'ai les entiers suivants

Bpeaks = 2 1 6 12 10 5 8
Cpeaks = 2 1
Dpeaks = 4 1 0 9 20 4 18 11 9 6

J'essaie d'ajouter l'entier (liste d'entiers ?) Bpeaks au dataframe Apeaks en tant que colonne. En même temps, la colonne Apeaks n'aura que 3 valeurs alors que la colonne Bpeaks en aura 7. J'essaie d'attribuer la valeur 0 à chaque ligne de Apeaks pour le nombre supplémentaire de lignes de Bpeaks.

Voici ce que j'espère pour mon résultat

Apeaks Bpeaks
1      2
6      1
5      6
0      12
0      10
0      5
0      8

De plus, lorsque j'ajoute une colonne de valeur plus courte, les lignes seront automatiquement affectées à 0. Par exemple

Cpeaks = 2 1

Apeaks Bpeaks Cpeaks
1      2      2
6      1      1
5      6      0
0      12     0
0      10     0
0      5      0
0      8      0

Et lorsque j'ajoute une autre colonne de plus grande longueur, toutes les colonnes existantes ajoutent une valeur de 0 pour chaque ligne supplémentaire. Par exemple

Dpeaks = 4 1 0 9 20 4 18 11 9 6

Apeaks Bpeaks Cpeaks Dpeaks
1      2      2      4
6      1      1      1
5      6      0      0
0      12     0      9
0      10     0      20
0      5      0      4
0      8      0      18
0      0      0      11
0      0      0      9
0      0      0      6

Y a-t-il un moyen de faire cela (un code serait très utile) ? Merci de votre aide !

2voto

Ananda Mahto Points 67213

Voici une alternative qui permet d'ajouter plusieurs vecteurs à la fois. Elle comprend également une option permettant de renommer la variable où le vecteur va être ajouté.

add_data <- function(df, ..., names = NULL) {
  l <- list(...)
  if (!is.null(names)) { if (length(names) != length(l)) stop("wrong number of names") }
  if (is.null(names)) names <- sapply(substitute(list(...))[-1], deparse)
  l <- c(c(df), setNames(l, names))
  out <- data.frame(lapply(l, `length<-`, max(lengths(l))))
  replace(out, is.na(out), 0)
}

Ici, nous ajoutons Bpeaks y Cpeaks en conservant le nom des objets.

add_data(df, Bpeaks, Cpeaks)
#   Apeaks Bpeaks Cpeaks
# 1      1      2      2
# 2      6      1      1
# 3      5      6      0
# 4      0     12      0
# 5      0     10      0
# 6      0      5      0
# 7      0      8      0

Ici, nous ajoutons Cpeaks y Dpeaks mais en les renommant en "C" et "D".

add_data(df, Cpeaks, Dpeaks, names = c("C", "D"))
#    Apeaks C  D
# 1       1 2  4
# 2       6 1  1
# 3       5 0  0
# 4       0 0  9
# 5       0 0 20
# 6       0 0  4
# 7       0 0 18
# 8       0 0 11
# 9       0 0  9
# 10      0 0  6

1voto

Ronak Shah Points 24715

Vous pouvez utiliser cette fonction pour ajouter de nouvelles colonnes :

add_Data <- function(df, vec) {
   colname <- deparse(substitute(vec))
   new_row <- max(nrow(df), length(vec))
   new_df <- df[1:new_row, ,drop = FALSE]
   new_df[colname] <- c(vec, rep(NA, new_row - length(vec)))
   new_df[is.na(new_df)] <- 0
   rownames(new_df) <- NULL
   new_df
}

Bpeaks = c(2, 1, 6, 12, 10, 5, 8)
Cpeaks = c(2, 1)
Dpeaks = c(4, 1, 0, 9, 20, 4, 18, 11, 9, 6)

df <- add_Data(df, Bpeaks)
df

#  Apeaks Bpeaks
#1      1      2
#2      6      1
#3      5      6
#4      0     12
#5      0     10
#6      0      5
#7      0      8

Ajout de Cpeaks

df <- add_Data(df, Cpeaks)
df
#  Apeaks Bpeaks Cpeaks
#1      1      2      2
#2      6      1      1
#3      5      6      0
#4      0     12      0
#5      0     10      0
#6      0      5      0
#7      0      8      0

Ajout de Dpeaks :

df <- add_Data(df, Dpeaks)
df
#   Apeaks Bpeaks Cpeaks Dpeaks
#1       1      2      2      4
#2       6      1      1      1
#3       5      6      0      0
#4       0     12      0      9
#5       0     10      0     20
#6       0      5      0      4
#7       0      8      0     18
#8       0      0      0     11
#9       0      0      0      9
#10      0      0      0      6

données

Nous avons commencé avec ce cadre de données :

df <- structure(list(Apeaks = c(1L, 6L, 5L)), class = "data.frame", 
row.names = c(NA, -3L))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X