28 votes

Ajout d'un dataframe à la fin d'un autre data.frame dans R

J'ai des difficultés à en ajouter un au bas d'un autre cadre de données.

J'ai un cadre de données (appelons-le DF1) qui comporte une ligne et cinq colonnes. J'ai un autre cadre de données (appelons-le DF2) qui comporte 50 lignes et 5 colonnes. Je l'ai configuré de telle sorte que les colonnes des DEUX cadres de données correspondent - elles ont les mêmes colonnes. En fait, DF1 est un calcul basé sur DF2.

Voici à quoi ressemble le DF1 :

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

C'est à ça que 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 censé être le nombre de points de données réels (nombre de valeurs qui ne sont pas manquantes) divisé par le nombre total de valeurs possibles.

Donc, 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

Lorsque 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 qu'elle soit la DERNIÈRE ligne.

Lorsque 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é la fusion, j'ai essayé d'ajouter une nouvelle ligne à DF2 et ensuite de soustraire les valeurs de DF2 rien ne semble fonctionner ! J'ai désespérément besoin d'aide ! Quelqu'un ?

16voto

BondedDust Points 105234

Voici ce que vous devez faire :

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

15voto

Swift Arrow Points 20

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

bothdfs <- rbind(df1, df2)

Les noms des colonnes seront automatiquement préservés.

3voto

Jeff Allen Points 4660

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

Tout d'abord, le data.frame basé sur des listes ne va pas se combiner très bien de cette manière. Si vous voulez lier les données, il est préférable de les convertir en matrice. Notez que vous devrez choisir un seul type pour chaque ligne de votre cadre de données, ce qui signifie que vous ne pourrez pas conserver vos chiffres en tant que chiffres s'ils sont liés à des caractères. Si vous êtes prêt à tout traiter comme un caractère, essayez :

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

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