没有分隔符的拆分 R 列

Split R column without delimiter

如何在没有分隔符的情况下拆分“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) 只是第一个数字,第二列 (view) 是第一个数字之后的所有内容。这是我希望结果数据框的样子:

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

谢谢!!

我们可以使用 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

或者可以使用 separatetidyr

library(tidyr)
df %>%
   separate(ID, into = c('n', 'view'), 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

使用 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