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.
¿Cómo puedo obtener tres subsistencias separadas para poder usar cada vector para los cálculos?
¿Cómo puedo tokenizar las subcadenas para crear vectores de valores numéricos?
4 respuestas
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.
Como sugiere en su pregunta, use
strsplit
consplit = "\n"
para dividir en una lista de 3 cadenas.Use
unlist
para cambiar esa lista en un vector de 3 cadenas de caracteres.Use
strsplit
nuevamente consplit = ","
para crear una lista de 3 vectores de caracteresUse
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
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
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
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
Nuevas preguntas
r
R es un entorno de software y lenguaje de programación de código abierto y gratuito para computación estadística, bioinformática, visualización y computación en general. Proporcione ejemplos mínimos y reproducibles junto con el resultado deseado. Use dput () para los datos y especifique todos los paquetes no base con llamadas a library (). No incruste imágenes para datos o código, use bloques de código con sangría en su lugar. Para preguntas relacionadas con estadísticas, use https://stats.stackexchange.com.