我有一个包含字符串的数据框。有没有一种方法来提取一定值后的字符串。例如。
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
答案 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)