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)"
3 Réponses :
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
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.
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")
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