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
。还有其他选项,例如 drop
或 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.
与 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.
我有一个具有以下结构的数据库。我想用描述分隔最后一列,一个部件号和另一列,用“-”分隔。在这个例子中它工作正常。但是当我在我的数据库(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
。还有其他选项,例如 drop
或 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.
与 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.