Tengo una cadena de caracteres:

String <- "268.1,271.1,280.9,294.7,285.6,288.6,384.4\n124.8,124.2,116.2,117.7,118.3,122.0,168.3\n18,18,18,18,18,18,18"

Me gustaría dividirlo en tres subcadenas basadas en \n.

Lo hice usando el siguiente código:

strsplit(String, "\n")

Resultó en tres subcadenas.

  1. ¿Cómo puedo obtener tres subsistencias separadas para poder usar cada vector para los cálculos?

  2. ¿Cómo puedo tokenizar las subcadenas para crear vectores de valores numéricos?

2
Mo.ms 24 jul. 2020 a las 02:12

4 respuestas

La mejor respuesta

Aquí hay un enfoque con la base R. strsplit es un poco complicado porque devuelve una lista y también no funciona en una lista.

  1. Como sugiere en su pregunta, use strsplit con split = "\n" para dividir en una lista de 3 cadenas.

  2. Use unlist para cambiar esa lista en un vector de 3 cadenas de caracteres.

  3. Use strsplit nuevamente con split = "," para crear una lista de 3 vectores de caracteres

  4. Use lapply para convertir esos vectores de caracteres en vectores numéricos.

lapply(strsplit(unlist(strsplit(String,"\n")),","),as.numeric)
[[1]]
[1] 268.1 271.1 280.9 294.7 285.6 288.6 384.4

[[2]]
[1] 124.8 124.2 116.2 117.7 118.3 122.0 168.3

[[3]]
[1] 18 18 18 18 18 18 18
4
Ian Campbell 23 jul. 2020 a las 23:29

Podemos usar read.table para leer String como marco de datos con separador como coma (,) que hará que las columnas sean numéricas automáticamente.

read.table(text = String, sep = ",")

#     V1    V2    V3    V4    V5    V6    V7
#1 268.1 271.1 280.9 294.7 285.6 288.6 384.4
#2 124.8 124.2 116.2 117.7 118.3 122.0 168.3
#3  18.0  18.0  18.0  18.0  18.0  18.0  18.0

Entonces podemos usar asplit para dividir los datos en cada fila:

asplit(read.table(text = String, sep = ","), 1)

#[[1]]
#   V1    V2    V3    V4    V5    V6    V7 
#268.1 271.1 280.9 294.7 285.6 288.6 384.4 

#[[2]]
#   V1    V2    V3    V4    V5    V6    V7 
#124.8 124.2 116.2 117.7 118.3 122.0 168.3 

#[[3]]
#V1 V2 V3 V4 V5 V6 V7 
#18 18 18 18 18 18 18 
0
Ronak Shah 24 jul. 2020 a las 00:26

Podemos usar scan. Después de dividir la 'Cadena' en \n, haga un bucle sobre la list y scan la cadena para leerla como vector

lapply(strsplit(String, "\n")[[1]], function(x) 
       scan(text = x, what = numeric(), sep=","))

O usando read.table (como se mostró originalmente)

read.table(text = String, sep=",")

Si hay un número desigual de elementos, use fill = TRUE

 read.table(text = String, sep=",", fill = TRUE)

Respuesta original:

read.table(text = String, sep=",")
#    V1    V2    V3    V4    V5    V6    V7
#1 268.1 271.1 280.9 294.7 285.6 288.6 384.4
#2 124.8 124.2 116.2 117.7 118.3 122.0 168.3
#3  18.0  18.0  18.0  18.0  18.0  18.0  18.0
2
Andreas 24 jul. 2020 a las 05:05
String<- "268.1,271.1,280.9,294.7,285.6,288.6,384.4\n124.8,124.2,116.2,117.7,118.3,122.0,168.3\n18,18,18,18,18,18,18"
   
string_vector <- unlist(strsplit(String, "\n"))

unlist(lapply(strsplit(string_vector, ','),as.numeric))

Salida

 [1] 268.1 271.1 280.9 294.7 285.6 288.6 384.4 124.8 124.2 116.2 117.7 118.3 122.0 168.3  18.0  18.0  18.0  18.0  18.0  18.0
[21]  18.0
0
mustafaakben 24 jul. 2020 a las 00:16