R извлекает элементы из строки на основе положения пробелов - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть фрейм данных, который состоит из метаданных пользователя, основанных на дате последней модификации.

Фрейм данных выглядит следующим образом -

dataframe=data.frame(Last_Modified=c("Peter Jones 11/02/1992 03:50:02 PM",
                                 "Veronika White  10/01/1996 13:12:00 AM",
                                 "Vincent Michaels  01/03/2008 12:01:00 PM"))

Желаемый вывод

Я хотел бы извлечь имя, дату и время и сохранить их в трех отдельных столбцах, которые называются Name, Date & Time.

Например, первая строка"Peter Jones 11/02/1992 03:50:02 PM" будет разбит на три дополнительных столбца с Name как Peter Jones, Date как 11/02/1992 и Time как 03:50:02 PM.И то же самое для остальных строк.

Моя попытка

Я пытаюсь использовать пробелы, которые разделяют каждую сущность, в качестве средства разделения.Основываясь на предыдущем посте, я попытался использовать варианты строки ниже.Но это не возвращает мне желаемый результат.

sub("^\\S+\\s+", '', dataframe$Last_Modified)

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

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018

Замените пробелы, за которыми следуют цифра с запятой, за которой следует та же цифра, а затем используйте read.table с sep=",":

read.table(text = gsub(" +(\\d)", ",\\1", dataframe[[1]]), 
 sep = ",", col.names = c("Name", "Date", "Time"), as.is = TRUE, strip.white = TRUE)

, давая:

              Name       Date        Time
1      Peter Jones 11/02/1992 03:50:02 PM
2   Veronika White 10/01/1996 13:12:00 AM
3 Vincent Michaels 01/03/2008 12:01:00 PM
0 голосов
/ 26 сентября 2018

Вот еще одна базовая опция R с использованием sub:

df = data.frame(Last_Modified=c("Peter Jones 11/02/1992 03:50:02 PM",
                                "Veronika White  10/01/1996 13:12:00 AM",
                                "Vincent Michaels  01/03/2008 12:01:00 PM"),
                stringsAsFactors=FALSE)

df$Name <- sub("(.*?)(?= \\d).*", "\\1", df$Last_Modified, perl=TRUE)
df$Date <- sub(".*(\\d{2}/\\d{2}/\\d{4}).*", "\\1", df$Last_Modified, perl=TRUE)
df$Time <- sub(".*(\\d{2}:\\d{2}:\\d{2} (?:AM|PM))", "\\1", df$Last_Modified, perl=TRUE)
df[c("Name", "Date", "Time")]

               Name       Date        Time
1       Peter Jones 11/02/1992 03:50:02 PM
2   Veronika White  10/01/1996 13:12:00 AM
3 Vincent Michaels  01/03/2008 12:01:00 PM

Демо

0 голосов
/ 26 сентября 2018

Вы также можете использовать пакет stringi с некоторым регулярным выражением:

library(stringi)

dataframe=data.frame(Last_Modified=c("Peter Jones 11/02/1992 03:50:02 PM",
                                     "Veronika White  10/01/1996 13:12:00 AM",
                                     "Vincent Michaels  01/03/2008 12:01:00 PM"))


name_part <- stri_match_last_regex(dataframe$Last_Modified, pattern = "^[A-Za-z ]*\\d")
dataframe$Name <- lapply(name_part, function(x) { trimws(stri_sub(x, 1, length = nchar(x) - 2))})
dataframe$Date <- stri_match_last_regex(dataframe$Last_Modified, pattern = "\\d\\d/\\d\\d/\\d\\d\\d\\d")
dataframe$Time <- stri_match_last_regex(dataframe$Last_Modified, pattern = "\\d\\d:\\d\\d:\\d\\d [AP]M")

dataframe
0 голосов
/ 26 сентября 2018

данные:

df1 = data.frame(Last_Modified=c("Peter Jones 11/02/1992 03:50:02 PM",
                                     "Veronika White  10/01/1996 13:12:00 AM",
                                     "Vincent Michaels  01/03/2008 12:01:00 PM"), stringsAsFactors = F)

код:

ans <- strsplit(df1$Last_Modified, "\\s+(?=\\d)", perl = T)

ans <- as.data.frame(do.call(rbind, ans), stringsAsFactors = F)
names(ans) <- c("Name", "Date", "Time")

результат:

#              Name       Date        Time
#1      Peter Jones 11/02/1992 03:50:02 PM
#2   Veronika White 10/01/1996 13:12:00 AM
#3 Vincent Michaels 01/03/2008 12:01:00 PM

Обратите внимание:

  • Вы называете свой dataframe dataframe.Не используйте зарезервированные ключевые слова языка в качестве имен переменных
  • В данных вашего примера символы преобразуются в коэффициенты: ПРОЧИТАЙТЕ ЭТО
  • \\s+(?=\\d) шаблон использует позитивный взгляд вперед,Читайте и узнавайте о позитивном взгляде в регулярные выражения.
...