Как разделить столбец в R на два столбца, если у меня нет разделителя? - PullRequest
1 голос
/ 12 февраля 2020

У меня есть набор данных с именем data1, который мне нужен, чтобы разбить первый столбец на два столбца. Проблема, с которой я сталкиваюсь, заключается в том, что между тем, что мне нужно разделить, и разницей в длине символов не существует разделителя во многих строках.

Я хотел бы разделить его по дате и полу.

Например

12/1/09male
1/9/20female
13/1/19female
4/12/12male

Я пробовал это, но потому что значения имеют различное количество символов Я застрял.

separate(data1, col = 1, into = c("date","sex"), sep = "")

Любая помощь будет принята с благодарностью!

Ответы [ 4 ]

3 голосов
/ 12 февраля 2020

Опцион представляет собой позитивный прогноз и прогноз на разделение на ди git, за которым следует "m" или "f".

df %>% separate(1, c("date", "sex"), sep = "(?<=\\d)(?=[mf])")
#    date    sex
#1 12/1/09   male
#2  1/9/20 female
#3 13/1/19 female
#4 4/12/12   male

Для того же стоит шаблон регулярных выражений работает в базе R strsplit

setNames(do.call(
    rbind.data.frame,
    strsplit(as.character(df[, 1]), "(?<=\\d)(?=[mf])", perl = T)),
    c("date", "sex"))

Пример данных

df <- read.table(text =
'12/1/09male
1/9/20female
13/1/19female
4/12/12male')
0 голосов
/ 12 февраля 2020

Используя tidyr::extract, мы можем собирать данные в две части. Сначала запишите дату (в формате д / м / г), а затем - всю оставшуюся часть строки.

tidyr::extract(df, V1, c("date", "sex"), "(\\d+/\\d+/\\d+)(.*)")

#     date    sex
#1 12/1/09   male
#2  1/9/20 female
#3 13/1/19 female
#4 4/12/12   male

данные

df <- structure(list(V1 = structure(c(2L, 1L, 3L, 4L), .Label = c("1/9/20female", 
"12/1/09male", "13/1/19female", "4/12/12male"), class = "factor")), 
class = "data.frame", row.names = c(NA,-4L))
0 голосов
/ 12 февраля 2020

Решение Base R с использованием gsub и некоторых регулярных выражений:

df_clean <- within(df, {
    date <- as.Date(gsub("[A-Za-z]+", "", V1), format = "%d/%m/%y")
    sex  <- as.factor(gsub("\\d+|\\/", "", V1))
    rm(V1)
  }
)

Данные:

df <- structure(list(V1 = structure(c(2L, 1L, 3L, 4L), .Label = c("1/9/20female", 
"12/1/09male", "13/1/19female", "4/12/12male"), class = "factor")), class = "data.frame", row.names = c(NA, 
-4L))
0 голосов
/ 12 февраля 2020

Я довольно плохо знаком с R, поэтому уверен, что это не самое элегантное решение. Я сначала добавляю запятую между датой и полом, а затем разделяю на запятую

a <- data.frame(row_1 = c("12/1/09male", "1/9/20female", "13/1/19female", "4/12/12male"))
a[, "row_1"] = str_replace(a$row_1, "(male|female)", ",\\1")
separate(a, row_1, ",", into = c("date", "sex"))
...