web-dev-qa-db-fra.com

Ajout d'un cadre de données à la fin d'un autre cadre de données dans R

J'ai du mal à en ajouter un au bas d'un autre bloc de données.

J'ai une trame de données (appelons-la DF1) qui a 1 ligne et 5 colonnes. J'ai un autre dataframe (appelons-le DF2) qui a 50 lignes et 5 colonnes. Je l'ai configuré de telle sorte que les colonnes entre les DEUX trames de données correspondent - elles ont les mêmes colonnes. En fait, DF1 est un calcul basé sur DF2.

Voici à quoi ressemble DF1:

   row.names     pt1     pt2     pt3     pt4
   calc          0.93    0.45    0.28    0.54

Voici à quoi ressemble DF2:

   row.names     pt1     pt2     pt3     pt4
   SNP1          AA      AG      AG      AA       
   SNP2          CT      CT      TC      CC
   SNP3          GG      CG      CG     <NA>
   SNP4          AA      GG      AG      AA
   SNP5         <NA>    <NA>    <NA>    <NA>

DF1 est supposé être le nombre de points de données réels (nombre de valeurs qui ne manquent pas) divisé par le nombre total de valeurs possibles.

SO .. Je veux ajouter DF1 au bas de DF2 pour ressembler à ceci:

   row.names     pt1     pt2     pt3     pt4
   SNP1          AA      AG      AG      AA       
   SNP2          CT      CT      TC      CC
   SNP3          GG      CG      CG     <NA>
   SNP4          AA      GG      AG      AA
   SNP5         <NA>    <NA>    <NA>    <NA>
   calc          0.93    0.45    0.28    0.54

Quand j'ai essayé d'utiliser

 both.dfs <- rbind(DF1, DF2)  # DF1 is first here

DF1 est la première ligne de DF2. J'AI BESOIN que ce soit le DERNIER rang.

Quand j'ai essayé d'utiliser

both.dfs <- rbind(DF2, DF1)  # DF2 is first here

Je reçois une erreur:

Warning messages:
1: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) :
  invalid factor level, NAs generated
2: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) :
  invalid factor level, NAs generated
3: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) :
  invalid factor level, NAs generated
4: In `[<-.factor`(`*tmp*`, iseq, value = 0.74) :
  invalid factor level, NAs generated

J'ai essayé de fusionner, j'ai essayé d'ajouter une nouvelle ligne à DF2, puis de remplacer les valeurs de DF2.. rien ne semble fonctionner! J'ai désespérément besoin d'aide! N'importe qui?

16
Sheila

Voici ce que vous devez faire:

DFtranspose <- cbind(t(DF1[2, ]), t(DF2))
rownames(DFtranspose) <- DF1[1, ]
13
42-

Je suis d'accord avec les commentaires, que c'est probablement une mauvaise idée, mais voici comment vous pouvez le faire.

Tout d'abord, avec le data.frame basé sur une liste ne va pas trop bien se combiner de cette façon. Si vous souhaitez lier les données, vous feriez mieux de les convertir en matrice. Notez que vous devrez choisir un seul type pour chaque ligne de votre bloc de données, de sorte que vous ne pouvez pas conserver vos nombres en tant que nombres s'ils sont liés à des caractères. Si vous êtes prêt à tout traiter comme un personnage, essayez-le:

> df1 <- data.frame(pt1="a", pt2="b", row.names=1)
> rownames(df1) <- "e"
> df2 <- data.frame(letters[1:4], pt1=1:4, pt2=2:5, row.names=1)
> rbind(as.matrix(df2), as.matrix(df1))
  pt1 pt2
a "1" "2"
b "2" "3"
c "3" "4"
d "4" "5"
e "a" "b"
3
Jeff Allen

Tant que vous traitez avec des trames de données, vous pouvez utiliser rbind ():

bothdfs <- rbind(df1, df2)

Les noms des colonnes seront automatiquement conservés.

0
Swift Arrow