2016-08-21 1 views
1

Ich habe eine Datenbank mit der folgenden Struktur. Ich möchte die letzte Spalte, eine Teilenummer und die andere mit der Beschreibung trennen, getrennt durch "-". Im Beispiel funktioniert das ok. Aber wenn ich das in meiner Datenbank verwende (50.700 Fälle) bekomme ich eine Fehlermeldung.tidyr :: separate funktioniert nicht mit großen Daten.frame

 rut<-c("50001780", "50001810", "50001820", 
      "50001850", "50001890", "50001940") 
     econ.activ<-c("552010 - RESTAURANTES",          
     "930990 - OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P.", 
     "523911 - COMERCIO AL POR MENOR DE ARTICULOS FOTOGRAFICOS", 
     "930990 - OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P.", 
     "930990 - OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P.", 
     "930990 - OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P.") 

     df<-data.frame(rut,econ.activ) 

     df %>% separate(col = "econ.activ", into = c("folio", "descripción"), sep = "\\-") 

Dies ist die Fehlermeldung

Warnmeldung: Zu viele Werte bei 174 Standorten: 3645, 4401, 5118, 10013, 10018, 10023, 10905, 10907, 10921, 10923, 10928 , 10930, 10935, 10937, 10942, 10944, 11586, 13556, 13557, 13614, ...

Vielen Dank im Voraus.

Antwort

1

Es könnte mehr als eine - in einigen Zeilen und das könnte der Grund für die Warnung sein. Eine Option ist cSplit von splitstackshape. Es teilt das 'econ.activ' in 'n' Spalten auf, basierend auf der maximalen Anzahl (d. H. 'N') von '-' in einer bestimmten Zeile. Standardmäßig wird NA auf Spalten aufgefüllt, wenn in bestimmten Zeilen weniger "-" angegeben ist.

library(splitstackshape) 
cSplit(df, "econ.activ", sep="-") 

Wenn wir brauchen, um die Warnung zu reproduzieren, legen Sie einfach eine andere - in einem der Elemente

df$econ.activ <- as.character(df$econ.activ) 
df$econ.activ[3] <- "930990 - OTRAS - SEP" 
df %>% 
    separate(col = "econ.activ", into = c("folio", "descripción"), sep = "\\-") 
--- 
--- 

Nachricht Warnung: Zu viele Werte bei 1 Standorte: 3

Es ist, weil die separate ein Argumenthaben, das standardmäßig warn ist. Es gibt andere Optionen wie drop oder merge. Wenn wir die drop verwenden sie den Teil aus den zweiten - entfernen ab

df %>% 
    separate(col = "econ.activ", into = c("folio", "descripción"), sep = "\\-", extra="drop") 
#  rut folio          descripción 
#1 50001780 552010          RESTAURANTES 
#2 50001810 930990 OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P. 
#3 50001820 930990            OTRAS 
#4 50001850 930990 OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P. 
#5 50001890 930990 OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P. 
#6 50001940 930990 OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P. 

und mit extra = "merge" es, dass der Teilkette in dem „descripción“ -Spalte behält. Also, im Grunde hängt es davon ab, was das OP als Ausgabe wünscht

df %>% 
    separate(col = "econ.activ", into = c("folio", "descripción"), 
       sep = "\\-", extra="merge") 
#  rut folio          descripción 
#1 50001780 552010          RESTAURANTES 
#2 50001810 930990 OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P. 
#3 50001820 930990          OTRAS - SEP 
#4 50001850 930990 OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P. 
#5 50001890 930990 OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P. 
#6 50001940 930990 OTRAS ACTIVIDADES DE SERVICIOS PERSONALES N.C.P. 
Verwandte Themen