不带分隔符的拆分 R 列

问题描述

如何在没有分隔符的情况下拆分列“ID”?这是我的示例数据框:

df=data.frame(ID=c("1a","1","2b","2c","1yolk","3","3yolk"),length=c(5.5,6.7,7.1,8.2,4.5,2.2,3.5))

如何将 ID 列拆分为两列,第一列 (n) 仅是第一个数字,第二列(视图)是第一个数字之后的所有内容。这是我希望生成的数据框的样子:

df=data.frame(n=c("1","2","3"),view=c("a","","b","c","yolk","yolk"),3.5))

谢谢!!

解决方法

使用 tidyr::extract,您可以指定有关如何拆分两列的正则表达式。

tidyr::extract(df,ID,c('n','view'),'(\\d+)(.*)',convert = TRUE)
  n view length
1 1    a    5.5
2 1         6.7
3 2    b    7.1
4 2    c    8.2
5 1 yolk    4.5
6 3         2.2
7 3 yolk    3.5
,

您可以使用 sub 和反向引用,\\1 来引用字符串的初始数字,\\2 引用它后面的任何内容:

df$n <- sub("(^\\d)(.*$)","\\1",df$ID)
df$view <- sub("(^\\d)(.*$)","\\2",df$ID)

如果超过 1 个数字,请使用 \\d+

结果:

df
     ID length n view
1    1a    5.5 1    a
2     1    6.7 1     
3    2b    7.1 2    b
4    2c    8.2 2    c
5 1yolk    4.5 1 yolk
6     3    2.2 3     
7 3yolk    3.5 3 yolk

如果要删除列 ID

df$ID <- NULL
,

我们可以使用 parse_number 提取数字部分,使用 str_remove 从“ID”中删除数字

library(dplyr)
library(stringr)
df1 <- df %>%
        mutate(n = readr::parse_number(ID),view = str_remove(ID,"\\d+"),ID = NULL) %>%
        select(n,view,length)

-输出

df1
#  n view length
#1 1    a    5.5
#2 1         6.7
#3 2    b    7.1
#4 2    c    8.2
#5 1 yolk    4.5
#6 3         2.2
#7 3 yolk    3.5

或者可以使用 separate 中的 tidyr

library(tidyr)
df %>%
   separate(ID,into = c('n',sep = "(?<=\\d)(?=[a-z]?)")

-输出

#  n view length
#1 1    a    5.5
#2 1         6.7
#3 2    b    7.1
#4 2    c    8.2
#5 1 yolk    4.5
#6 3         2.2
#7 3 yolk    3.5