2017-10-16 2 views
-2

J'ai une trame de données avec des noms pour l'identité de ligne et des dates comme identité de colonne.comment transformer/aplatir la trame de données R

df <- data.frame(`20171007` = c(8, 4), 
       `20171014` = c(9, 7), 
       row.names = c("Kohl", "Travis")) 

Ce que je veux est une structure de données avec trois colonnes, où l'identité est réellement des données.

Date (get from column identity) 
Name (get from row identity) 
Value (get from df[r,c]) 

Dans ce cas particulier, je finirais avec 4 lignes, une pour chaque valeur. Comment puis-je aplatir mon df dans cette structure?

+2

Comment écrire un exemple reproductible. https://stackoverflow.com/a/5965451/3651529 – Suren

Répondre

2

Vous pouvez faire quelque chose comme ça avec tidyverse:

library(tidyverse) 

df %>% 
    rownames_to_column(var = "Name") %>%  # tibble 
    gather(Date, Value, -Name) %>%   # tidyr 
    mutate(Date = as.Date(Date, "X%Y%m%d")) # dplyr 

Résultat:

Name  Date Value 
1 Kohl 2017-10-07  8 
2 Travis 2017-10-07  4 
3 Kohl 2017-10-14  9 
4 Travis 2017-10-14  7 

données:

df = data.frame(`20171007` = c(8, 4), 
       `20171014` = c(9, 7), 
       row.names = c("Kohl", "Travis")) 
0

La chose la plus simple à faire est u se quelque chose de semblable à ci-dessous. Une note de prudence, ce n'est généralement pas une bonne pratique d'avoir un nom de colonne numérique. Cela entraînera des problèmes de compatibilité avec d'autres fonctions.

df = data.frame(`20171007` = c(8,4), 
      `20171014` = c(9, 7)) 
row.names(df) = c('Kohl', 'Travis') 

Créer une colonne avec les noms de ligne

df$names <- row.names(df) 

Utilisez le paquet tidyr pour remodeler les données

EDIT - @user

df %>% 
    gather(date, value, -names) 
+0

Cela ne donne pas le résultat escompté puisque vos 'noms' sont également rassemblés. Vous devez exclure 'name' de' gather' comme 'df%>% gather (date, valeur, -name)' de ma réponse – useR

+0

Vous avez raison. Merci pour l'information. J'aime beaucoup mieux de toute façon (sans la gaffe). – jacobsg

0

Le simple-liner est à transposer le df puis melt (de reshape2)

melt(t(df), value.name = "Value", varnames = c("Date", "Name"))