1) dplyr / tidyr Замените каждое число точкой с запятой, этим числом и другой точкой с запятой, а затем разделите их точкой с запятой и необязательным окружающим пробелом.
library(dplyr)
library(tidyr)
# input
df <- data.frame(V1 = c("25 Edgemont 52 Sioux County",
"57 Burke 88 Papillion-LaVista South"))
df %>%
mutate(V1 = gsub("(\\d+)", ";\\1;", V1)) %>%
separate(V1, c(NA, "No1", "Let1", "No2", "Let2"), sep = " *; *")
## No1 Let1 No2 Let2
## 1 25 Edgemont 52 Sioux County
## 2 57 Burke 88 Papillion-LaVista South
1a ) read.table Мы можем использовать тот же gsub
, что и в (1), но затем отделить его с помощью read.table
. Пакеты не используются.
read.table(text = gsub("(\\d+)", ";\\1;", df$V1), sep = ";", as.is = TRUE,
strip.white = TRUE, col.names = c(NA, "No1", "Let1", "No2", "Let2"))[-1]
## No1 Let1 No2 Let2
## 1 25 Edgemont 52 Sioux County
## 2 57 Burke 88 Papillion-LaVista South
2) strcapture Мы можем использовать strcapture
из базы R:
proto <- list(No1 = integer(0), Let1 = character(0),
No2 = integer(0), Let2 = character(0))
strcapture("(\\d+) (.*) (\\d+) (.*)", df$V1, proto)
## No1 Let1 No2 Let2
## 1 25 Edgemont 52 Sioux County
## 2 57 Burke 88 Papillion-LaVista South
2a) read.pattern Мы можем использовать read.pattern с тем же шаблоном, что и в (2):
library(gsubfn)
read.pattern(text = format(df$V1), pattern = "(\\d+) (.*) (\\d+) (.*)",
col.names = c("No1", "Let1", "No2", "Let2"), as.is = TRUE, strip.white = TRUE)
## No1 Let1 No2 Let2
## 1 25 Edgemont 52 Sioux County
## 2 57 Burke 88 Papillion-LaVista South