问题描述
如何在没有分隔符的情况下拆分列“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