我试图将“ 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”?
答案 0 :(得分:5)
有两种方法:
1)展开正则表达式。假设年龄始终是最后3个字符,请使用下面显示的正则表达式。匹配|或最后三个字符,但不消耗它们。有关零宽度正向超前断言的信息,请参见?regex
。 convert=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)