У меня есть строка:
a = c("112 271 [X];313 179 [X];125 162;123 131 [X];124 107")
Я хочу сначала разделить его точкой с запятой ;
b = as.list(strsplit(a, ";")[[1]])
> b
[[1]]
[1] "112 271 [X]"
[[2]]
[1] "313 179 [X]"
[[3]]
[1] "125 162"
[[4]]
[1] "123 131 [X]"
[[5]]
[1] "124 107"
затем я хочу разделить b
на space
и сохранить результат в виде фрейма данных с тремя столбцами.
Результат выглядит так:
A B C
1 112 271 [X]
2 313 179 [X]
3 125 162
4 123 131 [X]
5 124 107
Я не знаю, как это сделать. Спасибо за вашу помощь.
Замените точку с запятой на новую строку, затем прочтите на заливку и установите имена столбцов:
data.table::fread(gsub(";", "\n", a, fixed = TRUE),
fill = TRUE,
col.names = LETTERS[1:3])
# A B C
# 1: 112 271 [X]
# 2: 313 179 [X]
# 3: 125 162
# 4: 123 131 [X]
# 5: 124 107
tidyverse
решение; две функции separate
и separate_rows
взяты из tidyr
(который является частью tidyverse
):
library(tidyr)
data.frame(a) %>%
separate_rows(a, sep = ";") %>%
separate(a,
into = c("A","B","C"),
sep = "\\s")
# A tibble: 5 × 3
A B C
<chr> <chr> <chr>
1 112 271 [X]
2 313 179 [X]
3 125 162 NA
4 123 131 [X]
5 124 107 NA
Базовый вариант R с использованием read.table
(аналогично решению @zx8754 data.table)
> read.table(text = gsub(";", "\n", a), fill = TRUE, col.names = head(LETTERS, 3))
A B C
1 112 271 [X]
2 313 179 [X]
3 125 162
4 123 131 [X]
5 124 107
Вы также можете сделать это с помощью stringr::str_split()
. В приведенном ниже примере я использую два последовательных вызова str_split()
с упрощенными выводами для создания матрицы символов, которую затем можно преобразовать во фрейм данных.
## Question data --------------------------------------------------
a <- c("112 271 [X];313 179 [X];125 162;123 131 [X];124 107")
require(stringr)
#> Loading required package: stringr
## Split into character matrix ------------------------------------
str_split(a, ";", simplify = TRUE) |>
str_split("[:space:]", simplify = TRUE) |>
## convert to data frame ----------------------------------------
as.data.frame() |>
setNames(c("A", "B", "C"))
#> A B C
#> 1 112 271 [X]
#> 2 313 179 [X]
#> 3 125 162
#> 4 123 131 [X]
#> 5 124 107
Created on 2022-11-16 with reprex v2.0.2
Можно было конечно и с базы :) Я по привычке автоматом использовал fread.