tidyr::separate 不适用于大 data.frame

tidyr::separate does'nt work with large data.frame

我有一个具有以下结构的数据库。我想用描述分隔最后一列,一个部件号和另一列,用“-”分隔。在这个例子中它工作正常。但是当我在我的数据库(50,700 个案例)中使用它时,我收到一条错误消息。

      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 = "\-")

这是错误信息

Warning message: Too many values at 174 locations: 3645, 4401, 5118, 10013, 10018, 10023, 10905, 10907, 10921, 10923, 10928, 10930, 10935, 10937, 10942, 10944, 11586, 13556, 13557, 13614, ...

提前致谢。

某些行中可能有多个 -,这可能是发出警告的原因。一个选项是 splitstackshape 中的 cSplit。它将根据特定行中“-”的最大数量(即 'n')将 'econ.activ' 拆分为 'n' 列。默认情况下,如果某些行中的“-”数量较少,它会将 NA 填充到列中。

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

如果我们需要重现警告,只需在其中一个元素中插入另一个 -

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 = "\-")
---
---

Warning message: Too many values at 1 locations: 3

这是因为 separate 有一个参数 extra,默认情况下是 warn。还有其他选项,例如 dropmerge。如果我们使用 drop 它会从第二个 - 开始删除子字符串

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.

extra = "merge" 一起,它将子字符串保留在 "descripción" 列中。所以,基本上,这取决于 OP 想要什么作为输出

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.