separadas - Contar valores separados por una coma en una cadena de caracteres
contar valores separados por comas excel (4)
Tengo este ejemplo de datos
d<-"30,3"
class(d)
Tengo los objetos de este carácter en una columna en el marco de datos de mi trabajo y necesito poder identificar cuántos números tiene.
He intentado usar la length(d)
, pero dice 1
Después de buscar solución aquí he intentado
eval(parse(text=''d''))
as.numeric(d)
as.vector.character(d)
Pero todavía no funciona.
¿Algún enfoque directo para resolver este problema?
Aquí hay una posibilidad
> as.numeric(unlist(strsplit("30,3", ",")))
# 30 3
Estos dos enfoques son cortos, trabajan en vectores de cadenas, no implican el gasto de construir explícitamente la cadena dividida y no utilizan ningún paquete. Aquí d
es un vector de cadenas como d <- c("1,2,3", "5,2")
:
1) contar. Campos
count.fields(textConnection(d), sep = ",")
2) gregexpr
lengths(gregexpr(",", d)) + 1
También stringi
probar stringi
package stri_count_*
(debería ser muy eficiente)
library(stringi)
stri_count_regex(d, "//d+")
## [1] 2
stri_count_fixed(d, ",") + 1
## [1] 2
stringr
paquete stringr
tiene una funcionalidad similar.
library(stringr)
str_count(d, "//d+")
## [1] 2
Actualizar:
Si desea subcontratar su conjunto de datos por vectores de longitud 2, puede probar
df[stri_count_regex(df$d, "//d+") == 2,, drop = FALSE]
# d
# 2 30,5
O mas simple
subset(df, stri_count_regex(d, "//d+") == 2)
# d
# 2 30,5
Actualización # 2
Aquí hay un punto de referencia que ilustra por qué se debe considerar el uso de paquetes externos (no se incluyó la respuesta de @rengis porque no responde la pregunta)
library(microbenchmark)
library(stringi)
d <- rep("30,3", 1e4)
microbenchmark( akrun = nchar(gsub(''[^,]'', '''', d))+1,
GG1 = count.fields(textConnection(d), sep = ","),
GG2 = sapply(gregexpr(",", d), length) + 1,
DA1 = stri_count_regex(d, "//d+"),
DA2 = stri_count_fixed(d, ",") + 1)
# Unit: microseconds
# expr min lq mean median uq max neval
# akrun 8817.950 9479.9485 11489.7282 10642.4895 12480.845 46538.39 100
# GG1 55451.474 61906.2460 72324.0820 68783.9935 78980.216 150673.72 100
# GG2 33026.455 43349.5900 60960.8762 51825.6845 72293.923 203126.27 100
# DA1 4730.302 5120.5145 6206.8297 5550.7930 7179.536 10507.09 100
# DA2 380.147 418.2395 534.6911 448.2405 597.259 2278.11 100
Usted podría utilizar la scan
.
v1 <- scan(text=d, sep='','', what=numeric(), quiet=TRUE)
v1
#[1] 30 3
O usando stri_split
desde stringi
. Esto debería tomar tanto character
como clase de factor
sin convertir explícitamente a carácter usando as.character
library(stringi)
v2 <- as.numeric(unlist(stri_split(d,fixed='','')))
v2
#[1] 30 3
Puedes hacer el count
usando la base R
por
length(v1)
#[1] 2
O
nchar(gsub(''[^,]'', '''', d))+1
#[1] 2
Visualizar el regex
[^,]
Actualizar
Si d
es una columna en un dataset df
y desea agrupar filas con números de dígitos es igual a 2
d<-c("30,3,5","30,5")
df <- data.frame(d,stringsAsFactors=FALSE)
df[nchar(gsub(''[^,]'', '''',df$d))+1==2,,drop=FALSE]
# d
#2 30,5
Solo para probar
df[nchar(gsub(''[^,]'', '''',df$d))+1==10,,drop=FALSE]
#[1] d
#<0 rows> (or 0-length row.names)