2017-10-03 15 views
0

J'ai un dataframe comme ceci:Comment créer des colonnes à partir de valeurs dans R?

   X1     X2 
1  Country     Spain 
2  Year     2016 
3  Value     34.56 
4  Country     Italy 
5  Year     2016 
6  Value     48.21 
7  Country     USA 
8  Year     2016 
9  Value     84.37 
10  Country    France 
11  Year     2016 
12  Value     18.94 

etc.

X1 et X2 sont des colonnes. J'ai gratté ces données à partir d'un site Web, mais je voudrais avoir ceci:

Country Year Value 
Spain  2016 34.56 
Italy  2016 48.21 
USA  2016 84.37 
France  2016 18.94 

J'ai essayé quelque chose avec gather() fonction, mais j'échoué. Toute aide est grandement appréciée.

+1

Ceci est une double question, mais je ne peux pas trouver un bon poste pour le moment. La méthode la plus simple est 'unstack (dat, X2 ~ X1)'. où dat est le nom de votre data.frame. Notez que les nouvelles colonnes sont des facteurs, vous devez donc passer par eux et convertir les pertinents en numérique. Quelque chose comme 'newDat [2: 3] <- lapply (newDat [2: 3], as.numeric)'. – lmo

Répondre

0

si votre dataframe actuel est appelé df alors cela devrait faire l'affaire:

Country <- df$X2[df$X1 == "Country"] 
Value <- df$X2[df$X1 == "Value"] 
Year <- df$X2[df$X1 == "Year"] 

df_new <- data.frame(Country, Year, Value) 
+0

Cela m'aide beaucoup, merci, mais j'ai un autre problème. J'ai des données manquantes, pas NA, mais des valeurs vides, comme avoir un Pays: Syrie, Année: 2016, et Valeur: rien, c'est vide. Comment puis-je faire des données avec ceci en utilisant votre méthode? –

+0

Je ne pense pas que les dataframes puissent contenir des valeurs vides (les numéros de ligne doivent être identiques sur toutes les colonnes). Peut-être que ce n'est pas vide mais juste un espace? ou est-ce que les données dont vous parlez ne sont pas encore importées et que vous ne pouvez pas les importer dans une base de données? – brettljausn

2

Essayez:

output <- data.frame(t(matrix(data$X2,3))) 
colnames(output) <- c("Country", "Year", "Value") 

Si vous avez des longueurs variables, mais « Pays » est toujours dans la première rangée d'un nouveau « bloc d'information » essayer:

library(data.table) # because i dont like data.frame 
library(zoo) # for na.locf (last observation carried forward) 
dt <- data.table(df) 
dt[X1 == "Country", X3 := 1:length(X1 == "Country")] 
dt[, X3 := na.locf(X3)] 
dt 
dcast(dt, X3 ~ X1) 

En substance, cela crée une colonne ID (X3) que vous pouvez utiliser pour diffuser la table depuis un format long vers un format large.

+0

C'est mon erreur que je n'ai pas mentionné que ces données sont en désordre. J'ai quelque chose comme ça dans X1: Pays, Année, Valeur, Pays, Année, Valeur, Pays, Valeur, Pays, Année, Valeur, PIB, Pays, Année, Valeur, ect. –

+0

Pensé à ce sujet aussi. Si les données sont complètes (c.-à-d. Pas de valeurs manquantes) et non mixtes (c.-à-d. Les valeurs d'un pays A après trois autres pays, dans ce cas, il serait clairement impossible), vous pouvez trier les données par X1 puis faire quelque chose de semblable à ce qui précède. – guscht

+0

J'ai ajusté ma réponse originale pour être plus générique. – guscht