valores separados separadas por palabras numeros especificos contar comas celda caracteres r vector character

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

[^,]

Demo Debuggex

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)