如何使用separate()函数分离"m014"

Nat*_* LI 2 r

我试图将"new_sp_m014"分成四列(new,var,sex,age).我使用了以下块:

task2 %>% separate(code, into = c("new","var","sex","age"), sep = "_")
Run Code Online (Sandbox Code Playgroud)

并且结果适用于new ="new",var ="sp",但是sex ="m014",年龄是NA.

那我怎么能把"m014"分为sex ="m"和age ="014"呢?

G. *_*eck 5

这有两种方法:

1)展开正则表达式假设age始终是最后3个字符,请使用下面显示的正则表达式.它匹配| 或者最后三个字符,但不消耗它们.有关零宽度正向先行断言的?regex信息,请参阅参考资料.该参数是可选的,但如果使用的话将年龄转换为数值.convert=TRUE

library(tidyr)

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

赠送:

  new var sex age
1 new  sp   m  14
Run Code Online (Sandbox Code Playgroud)

2)insert _ 我们可以在年龄之前插入一个_然后用问题中的代码处理它(除了我们已经添加了convert=TRUE如上所述的可选项),给出相同的结果.sep在这种情况下我们可以使用默认值或使用sep = "_".

library(dplyr)
library(tidyr)

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

注意

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

task2 <- data.frame(code = "new_sp_m014")
Run Code Online (Sandbox Code Playgroud)