Извлекать строки после определенного значения - PullRequest
2 голосов
/ 09 октября 2019

У меня есть датафрейм, содержащий строки. Есть ли способ извлечь строки после определенного значения. Например.

df

Col
2017-09-19.I.L_WAY
2017-09-19.I.L_TEMP

Есть ли способ извлечь

df1

Col                       Col1        Col2
2017-09-19.I.L_WAY      2017-09-19  I.L_WAY  
2017-09-19.I.L_TEMP     2017-09-19  I.L_TEMP

Ответы [ 3 ]

2 голосов
/ 09 октября 2019

Мы можем использовать strsplit из base R

df[c("Col1", "Col2")] <- do.call(rbind, strsplit(df$Col, "(?<=\\d)\\.", perl = TRUE))

df
#                 Col       Col1     Col2
#1  2017-09-19.I.L_WAY 2017-09-19  I.L_WAY
#2 2017-09-19.I.L_TEMP 2017-09-19 I.L_TEMP

данные

df <- structure(list(Col = c("2017-09-19.I.L_WAY", "2017-09-19.I.L_TEMP"
)), class = "data.frame", row.names = c(NA, -2L))
2 голосов
/ 09 октября 2019

1) отдельно с использованием df, воспроизводимым в примечании, в конце использования separate:

library(dplyr)
library(tidyr)

df %>%
  separate(Col, c("Col1", "Col2"), sep = "\\.", extra = "merge", remove = FALSE)

, дающим:

                  Col       Col1     Col2
1  2017-09-19.I.L_WAY 2017-09-19  I.L_WAY
2 2017-09-19.I.L_TEMP 2017-09-19 I.L_TEMP

2) as.Date/sub Это создает Date столбец класса Col1 и столбец класса символов Col2 без использования пакетов.

transform(df, Col1 = as.Date(Col), Col2 = sub("[^.]+\\.", "", Col),
  stringsAsFactors = FALSE)

, что дает:

                  Col       Col1     Col2
1  2017-09-19.I.L_WAY 2017-09-19  I.L_WAY
2 2017-09-19.I.L_TEMP 2017-09-19 I.L_TEMP

3) read.table Это еще одна базовая альтернатива R. Замените первую точку точкой с запятой, прочитайте ее df$Col, предполагая, что поля разделены точкой с запятой, и cbind, что с df:

cbind(df, read.table(text = sub("\\.", ";", df$Col), sep = ";", as.is = TRUE,
  col.names = c("Col1", "Col2")))

, давая:

                  Col       Col1     Col2
1  2017-09-19.I.L_WAY 2017-09-19  I.L_WAY
2 2017-09-19.I.L_TEMP 2017-09-19 I.L_TEMP

Примечание

Lines <- "Col
2017-09-19.I.L_WAY
2017-09-19.I.L_TEMP"
df <- read.table(text = Lines, header = TRUE, as.is = TRUE)
1 голос
/ 09 октября 2019

Мы можем использовать stringr:

cbind(df, data.frame(stringr::str_split_fixed(df$Col, pattern = '\\.', n = 2)))
#                   Col         X1       X2
# 1  2017-09-19.I.L_WAY 2017-09-19  I.L_WAY
# 2 2017-09-19.I.L_TEMP 2017-09-19 I.L_TEMP

Другой вариант, используя tidyr:

tidyr::extract(df, Col, c("Col1", "Col2"), '^(.*?)\\.(.*)', convert=TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...