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

时间:2016-08-21 04:33:59

标签: r tidyr

我有一个具有以下结构的数据库。我想将最后一列,一个部件号和另一个与描述分开,用“ - ”分隔。在示例中,它可以正常工作。但是当我在我的数据库中使用它(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 = "\\-")

这是错误消息

  

警告讯息:               在174个位置的值太多:3645,4401,5118,10013,10018,10023,10905,10907,10921,10923,10928,10930,10935,10937,10942,10944,11586,13556,13557,13614,......

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

splitstackshape

如果我们需要重现警告,只需在其中一个元素中插入另一个library(splitstackshape) cSplit(df, "econ.activ", sep="-")

-
  

警告消息:1个位置的值太多:3

这是因为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 = "\\-") --- --- 有一个参数separate,默认为extra。还有其他选项,例如warndrop。如果我们使用merge,则从第二个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. ,它会在“descripción”列中保留该子字符串。所以,基本上,它取决于OP想要的输出

extra = "merge"