如何使用split()函数分隔“ m014”

时间:2018-08-18 13:26:24

标签: r

我试图将“ new_sp_m014”分为四列(新,变量,性别,年龄)。我使用了以下块:

task2 %>% separate(code, into = c("new","var","sex","age"), sep = "_")

对于new =“ new”,var =“ sp”,但sex =“ m014”和age为NA的结果很好。

那么,如何将“ m014”分别分隔为sex =“ m”和age =“ 014”?

2 个答案:

答案 0 :(得分:5)

有两种方法:

1)展开正则表达式。假设年龄始终是最后3个字符,请使用下面显示的正则表达式。匹配|或最后三个字符,但不消耗它们。有关零宽度正向超前断言的信息,请参见?regexconvert=TRUE参数是可选的,但如果使用,则会将年龄转换为数字。

library(tidyr)

task2 %>% 
  separate(code, into = c("new", "var", "sex", "age"), sep = "_|(?=...$)", 
    convert = TRUE)

给予:

  new var sex age
1 new  sp   m  14

2)插入_ 我们可以在年龄之前插入_,然后使用问题中的代码进行处理(除非我们如上所述添加了可选的convert=TRUE),同样的结果。在这种情况下,我们可以使用默认的sep或使用sep = "_"

library(dplyr)
library(tidyr)

task2 %>%
  mutate(code = sub("(...)$", "_\\1", code)) %>%
  separate(code, into = c("new", "var", "sex", "age"), convert = TRUE)

注意

以可重复的形式使用的输入是:

task2 <- data.frame(code = "new_sp_m014")

答案 1 :(得分:3)

separate()可以取一个整数位置,在该位置可以分开...您可以分两个阶段进行。

dd <- tibble(v="new_sp_m014")
dd %>%
    separate(v,into=c("a","b","tmp"),"_") %>%
    separate(tmp,into=c("c","d"),sep=1)