提取一定值后的字符串

时间:2019-10-09 14:09:09

标签: r

我有一个包含字符串的数据框。有没有一种方法来提取一定值后的字符串。例如。

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 个答案:

答案 0 :(得分:2)

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

给予:

Date

2)as.Date/sub 这将创建一个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

给予:

df$Col

3)read.table 这是另一个R替代方案。用分号替换第一个点,假定分号分隔字段,将其读取为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)

注意

age

答案 1 :(得分:2)

我们可以使用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 :(得分:1)

我们可以使用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)