我有一个小标题,其中有一列包含格式为XX_YY_ZZ的字符串。我需要使用 first 下划线作为分隔符,将该列分为两个个不同的列。
函数tidyr :: separate将匹配两个下划线,并在第二个之后删除该字符串。在Google上四处搜寻,发现正则表达式“ (?!。* )”仅与最后一个下划线匹配,但是我找不到与第一个下划线匹配的正则表达式。
我的数据如下:
d <- tibble(var = paste0(LETTERS[1:5], "_", 1:5, "_", letters[1:5]))
d %>% separate(var, into=c("newcol1", "newcol2"))
# A tibble: 5 x 2
newcol1 newcol2
<chr> <chr>
1 A 1
2 B 2
3 C 3
4 D 4
5 E 5
Warning message:
Expected 2 pieces. Additional pieces discarded in 5 rows [1, 2, 3, 4, 5].
我需要拥有的是:
# A tibble: 5 x 2
newcol1 newcol2
<chr> <chr>
1 A 1_a
2 B 2_b
3 C 3_c
4 D 4_d
5 E 5_e
答案 0 :(得分:2)
1)指定extra = "merge"
d %>%
separate(var, into=c("newcol1", "newcol2"), extra = "merge", sep = "_")
2)或将第一个下划线替换为两个下划线,然后在其上进行分割。
d %>%
mutate(var = sub("_", "__", var)) %>%
separate(var, into=c("newcol1", "newcol2"), sep = "__")
3)或仅使用mutate
和sub
而不是separate
:
d %>%
mutate(newcol1 = sub("_.*", "", var), newcol2 = sub(".*?_", "", var), var = NULL)
答案 1 :(得分:0)
这是解决问题的一种方法。
d %>% separate(var, into = c("newcol1", "newcol2"), sep = "_(?=.*_)")
在这里,正则表达式_(?=.*_)
的意思是:_
后跟一个包含另一个_
的字符串。
结果:
# A tibble: 5 x 2
newcol1 newcol2
<chr> <chr>
1 A 1_a
2 B 2_b
3 C 3_c
4 D 4_d
5 E 5_e