2017-11-19 1 views
0

Zum Beispiel habe ich einen Datenrahmen, der wie folgt aussieht:Gibt es eine R-Funktion, die eine Spalte in eine beliebige Anzahl von Spalten mit mehreren Spalten aufteilt?

df = data.frame(x=c('a, b, c','b, c', 'd, e')) 

Idealerweise würde ich mit einem Datenrahmen am Ende, das wie folgt aussieht:

df.transformed = data.frame(x.a = c(1,0,0), 
          x.b = c(1,1,0), 
          x.c = c(1,1,0), 
          x.d = c(0,0,1), 
          x.e = c(0,0,1)) 

Wo jede der möglichen komma Begrenzte Werte innerhalb x wurden getrennt.

Ich habe manuelle Lösungen für dieses Problem viele Male codiert, aber das ist etwas, das ich oft in Umfragedaten gefunden habe, um mich wundern, warum dies nicht in einem Paket wie tidyr enthalten ist, da die separate Funktion in diesem Paket scheint weniger nützlich. Ich möchte dies in einer Zeile nach dem Laden der benötigten Pakete tun können.

+0

Versuchen 'qdapTools :: mtabulate (strsplit (as.character (df $ x) " \\ s *"))' oder mit '' tidyverse' rownames_to_column (df, 'rn')%>% separate_rows (x)%>% mutieren (i = 1)%>% spread (x, i, fill = 0) ' – akrun

+0

Wenn Sie es umbenennen müssen, ketten Sie es mit'%>% aus (-rn)%>% rename_all (Spaß (paste0 ("x",.))) – akrun

Antwort

2

Dies kann entweder geschehen mit qdapTools wo wir spl es die ‚x‘ durch , durch Null oder mehrere Leerzeichen gefolgt und mtabulate

library(qdapTools) 
mtabulate(strsplit(as.character(df$x), ",\\s*")) 
# a b c d e 
#1 1 1 1 0 0 
#2 0 1 1 0 0 
#3 0 0 0 1 1 

Oder nutzen wir verwenden, um den tidyverse Ansatz

library(tidyverse) 
rownames_to_column(df, 'rn') %>% #add row names 
     separate_rows(x) %>% #split the rows into long format 
     mutate(i = 1) %>% #create a column of 1s 
     spread(x, i, fill = 0) %>% #spread to wide format 
     select(-rn) %>% #remove unnecessary columns 
     rename_all(funs(paste0("x.", .))) #rename if needed 
# x.a x.b x.c x.d x.e 
#1 1 1 1 0 0 
#2 0 1 1 0 0 
#3 0 0 0 1 1 

HINWEIS: Nur meine Kommentare als Lösung veröffentlichen


Oder eine andere Option ist von - Keine Pakete verwendet

table(stack(setNames(strsplit(as.character(df$x), ",\\s*"), seq_len(nrow(df))))[2:1]) 
#  values 
#ind a b c d e 
# 1 1 1 1 0 0 
# 2 0 1 1 0 0 
# 3 0 0 0 1 1 
2

Fügen Sie eine Zeilennummernspalte hinzu, trennen Sie x in Zeilen und fügen Sie jedes Element in x mit vor. Führen Sie dann table aus und konvertieren Sie das in einen Datenrahmen. Wenn Sie nicht jedem Namen vorangestellt werden müssen, kann die Zeile mit paste weggelassen werden. Wenn Sie keinen Datenrahmen benötigen (eine Tabelle ist in Ordnung), kann die letzte Zeile weggelassen werden.

library(dplyr) 
library(tidyr) 

df %>% 
    mutate(row = 1:n()) %>% 
    separate_rows(x) %>% 
    mutate(x = paste("x", x, sep = ".")) %>% 
    table %>% 
    as.data.frame.matrix 

geben:

x.a x.b x.c x.d x.e 
1 1 1 1 0 0 
2 0 1 1 0 0 
3 0 0 0 1 1 

Beachten Sie, dass, wenn wir die optionalen Zeilen weglassen, dann haben wir diese:

df %>% 
    mutate(row = 1:n()) %>% 
    separate_rows(x) %>% 
    table 

geben:

x 
row a b c d e 
    1 1 1 1 0 0 
    2 0 1 1 0 0 
    3 0 0 0 1 1 
Verwandte Themen