2017-10-24 1 views
2

ich einen Datenrahmen mit Spezies haben, wie folgt aus:trennen, um eine Spalte in n-Ebenen Spalten in R

df <- data.frame("especie" = c("abies", "abies", "acacia", "acacia", "acacia"), "use"=c("ornamental", "wood", "wood", "medicine", "firewood")) 

df 
    especie  use 
1 abies ornamental 
2 abies  wood 
3 acacia  wood 
4 acacia medicine 
5 acacia firewood 

Ich will es "Spread", so dass es wie geht:

df2 <- data.frame("species"=c("abies", "acacia"), "use1"=c("ornamental", "wood"), "use2"=c("wood", "medicine"), 
             "use3"=c("", "firewood"), "use4"=c("", "")) 

df2 
    species  use1  use2  use3 use4 
1 abies ornamental  wood    
2 acacia  wood medicine firewood 

Ich möchte keine Spalte mit dem Namen jedes Levels, also tut tidyr :: spread nicht, was ich will; wenn die Spezies nur eine "Verwendung" hat, sollte sie in "Use1" sein, ich habe keine Ahnung, wie das gemacht werden kann

Antwort

2

Hier ist eine Möglichkeit, es zu tun, vorausgesetzt, dass die Zeilennummern in der Reihenfolge angeordnet sind gleiche Art und Weise wollen Sie "use1 ... use3" und use4 ist nicht wichtig (es ist alles leer?)

library(dplyr) 
library(tidyr) 

df %>% 
    group_by(especie) %>% 
    mutate(rowNum = paste0("use",row_number())) %>% 
    spread(rowNum, use) 

und das Ergebnis ist verwenden ...

# A tibble: 2 x 4 
# Groups: especie [2] 
    especie  use1  use2  use3 
* <fctr>  <fctr> <fctr> <fctr> 
1 abies ornamental  wood  NA 
2 acacia  wood medicine firewood 
+0

es hat funktioniert, auch für diejenigen Arten mit 4 Anwendungen –

Verwandte Themen