没有分隔符的拆分 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
或者可以使用 separate
从 tidyr
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
如何在没有分隔符的情况下拆分“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
或者可以使用 separate
从 tidyr
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