如何使用2种不同条件将字符串(在列中)拆分为2个单独的列,并仅保留这2个列?

时间:2019-05-16 16:08:03

标签: r split

我有一列这样的字符串:

|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)]

还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用dplyrtidyr

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)