我有一列这样的字符串:
|Image
|---
|CR 00_01_01
|SF 45_04_07
|ect
我想得到一个最终结果:
| Condition | Time |
| --- | --- |
| CR | 00 |
我有2个步骤来做,但是非常麻烦。本质上,我先使用空格将字符串拆分两次,然后使用_拆分字符串。
df <- df[, c("Condition","T") := tstrsplit(Image, " ", fixed=T)]
df <- df[, c("Time") := tstrsplit(T, "_", fixed=TRUE, keep = 1L)]
还有更好的方法吗?
答案 0 :(得分:1)
您可以使用dplyr
和tidyr
df%>%separate(image,c("Image","Time")," ")%>%
mutate(Time=sub("([0-9]+).*","\\1",Time))
Image Time
1 CR 00
2 SF 45
数据
structure(list(image = c("CR 00_01_01", "SF 45_04_07")), class = "data.frame", row.names = c(NA,
-2L))
答案 1 :(得分:0)
这里是一个strsplit
解决方案,听起来像是您要寻找的。根据空格或下划线进行拆分,然后选择前两个元素。
split_string <- strsplit(df1$Image, split = "\\s|_")
data.frame(Condition = sapply(split_string, `[`, 1),
Time = sapply(split_string, `[`, 2))
Condition Time
1 CR 00
2 SF 45
如果Image
列的格式始终相同,则可以基于位置提取。
data.frame(Condition = substr(df1$Image, 1, 2),
Time = substr(df1$Image, 4, 5))
Condition Time
1 CR 00
2 SF 45
或者您可以只使用正则表达式提取字母/第一对数字。
data.frame(Condition = gsub("^([[:alpha:]]+).*", "\\1", df1$Image),
Time = gsub(".*[[:space:]]([[:digit:]]+)_.*", "\\1", df1$Image))
Condition Time
1 CR 00
2 SF 45
数据:
df1 <- data.frame(Image = c("CR 00_01_01", "SF 45_04_07"), stringsAsFactors = F)