1
votes

Je souhaite créer une nouvelle colonne dans ma base de données en fonction des informations d'une autre base de données

J'ai deux bases de données distinctes (Database_1 et Database_2) Je souhaite ajouter le profil de hauteur de Database_2 à Database_1 en tant que nouvelle colonne dans Database_1.

Database_1:

Horse_type   Height_profile
Stallion     Large
Race_horse   Medium
Work_horse   Small
Work_horse   Small

Jusqu'à présent, j'ai seulement essayé de faites ceci en utilisant une boucle for.

for (row in 1:nrow(Database_1)) {

if(Database_1$Horse_type == Database_2$Horse_type) {

Database_1$New_Column <- Database_2$height_profile
 }
}

J'attends la sortie:

Database_1:

Horse_type
Stallion
Race_horse
Work_horse
Work_horse

Database_2:

Horse_type   Height_profile
Stallion     Large
Race_horse   Medium
Work_horse   Small
Pure_breed   Huge

Mais la sortie réelle est: p>

"Il y avait 50 avertissements ou plus (utilisez warnings () pour voir les 50 premiers)"

r

0 commentaires

3 Réponses :


0
votes

Votre boucle a quelques problèmes. La première chose qui me saute aux yeux est que vous créez une ligne pour représenter chaque élément de la liste que vous allez boucler, mais ne l'appelez jamais dans votre boucle réelle. Cela pourrait être quelque chose à examiner la prochaine fois ... Quoi qu'il en soit, cela fonctionne:

   #create dataframes
    df1 <- as.data.frame(list(Horse_type= c("Stallion",
                                            "Race_horse",
                                            "Work_horse",
                                            "Work_horse")
                              ), stringsAsFactors = F,
                         )

    df2 <- as.data.frame(list(Horse_type= c("Stallion",
                                            "Race_horse",
                                            "Work_horse",
                                            "Pure_breed"),
                              Height_profile= c("Large",
                                                "Medium",
                                                "Small",
                                                "Huge")
                              ), stringsAsFactors = F,
                         )
    #initialize empty column to capture output of loop iteratively  
    New_column <- NULL
    for (i in 1:nrow(df1)) {
      New_column[i] <- df2$Height_profile[
        which(df1$Horse_type[i] == df2$Horse_type)
        ]
    }
    #attach output of loop as a variable to df1
    df1$height <- New_column


1 commentaires

Notez que cela a été particulièrement facile car vous n'avez pas de cas répétés dans df1 , ET dans chaque Horse_type vous n'aviez qu'un seul height_profile invariant. En raison de cette cohérence de correspondance, vous pouvez améliorer la boucle pour lui permettre de gérer au moins les doublons de df1 $ Horse_type en ajoutant un [1] à la fin du quelle recherche, pour extraire une seule des correspondances (car toutes les correspondances correspondront au Height_profile correct.



1
votes

Une boucle semble être une manière compliquée de faire cela. Vous pouvez simplement fusionner les deux blocs de données par la colonne commune Horse_type et les valeurs seront ajoutées en tant que nouvelle colonne:

database_1 <- merge(database_1, database_2, by = "Horse_type")


0 commentaires

0
votes

Vous pouvez utiliser le package data.table -

> merge(database1,database2)

  Horse_type Height_profile
1 Race_horse         Medium
2   Stallion          Large
3 Work_horse          Small
4 Work_horse          Small

OU

> setkey(database1,"Horse_type")
> setkey(database2,"Horse_type")
> setDT(database2)[setDT(database1),]

 Horse_type Height_profile
1: Race_horse         Medium
2:   Stallion          Large
3: Work_horse          Small
4: Work_horse          Small


0 commentaires