使用单独的仅考虑 R 中的第一个点的拆分列
Split columns considering only the first dot in R using separate
这是我的数据框:
df <- tibble(col1 = c("1. word","2. word","3. word","4. word","5. N. word","6. word","7. word","8. word"))
我需要使用单独的函数分成两列,并将它们重命名为 Numbers
,其他的称为 Words
。我这样做但没有用:
df %>% separate(col = col1 , into = c('Number','Words'), sep = "^. ")
问题是第五个有 2 个点。我不知道如何处理关于正则表达式的问题。
有什么帮助吗?
我不确定如何使用 tidyr
执行此操作,但以下内容应该适用于基础 R
。
df$col1 <- gsub('N. ', '', df$col1)
df$Numbers <- as.numeric(sapply(strsplit(df$col1, ' '), '[', 1))
df$Words <- sapply(strsplit(df$col1, ' '), '[', 2)
df$col1 <- NULL
结果
> head(df)
Numbers Words
1 1 word
2 2 word
3 3 word
4 4 word
5 5 word
6 6 word
tidyverse
方法是先清理数据然后分离。
df %>%
mutate(col1 = gsub("\s.*(?=word)", "", col1, perl=TRUE)) %>%
tidyr::separate(col1, into = c("Number", "Words"), sep="\.")
结果:
# A tibble: 8 x 2
Number Words
<chr> <chr>
1 1 word
2 2 word
3 3 word
4 4 word
5 5 word
6 6 word
7 7 word
8 8 word
我假设您希望保留笨重的“N”。在结果中。为此,我的建议是使用 extract
而不是 separate
:
df %>%
extract(
col = col1 ,
into = c('Number','Words'),
regex = "([0-9]+)\. (.*)")
正则表达式 ([0-9]+)\. (.*)
表示您首先要查找要放在第一列中的数字,然后是一个点和一个 space(\.
) 应该被丢弃,其余的应该放在第二列中。
结果:
# A tibble: 8 × 2
Number Words
<chr> <chr>
1 1 word
2 2 word
3 3 word
4 4 word
5 5 N. word
6 6 word
7 7 word
8 8 word
这是使用 readr
s parse_number
和正则表达式的替代方法:
library(dplyr)
library(readr)
df %>%
mutate(Numbers = parse_number(col1), .before=1) %>%
mutate(col1 = gsub('\d+\. ','',col1))
Numbers col1
<dbl> <chr>
1 1 word
2 2 word
3 3 word
4 4 word
5 5 N. word
6 6 word
7 7 word
尝试 read.table
+ sub
> read.table(text = sub("\.", ",", df$col1), sep = ",")
V1 V2
1 1 word
2 2 word
3 3 word
4 4 word
5 5 N. word
6 6 word
7 7 word
8 8 word
这是我的数据框:
df <- tibble(col1 = c("1. word","2. word","3. word","4. word","5. N. word","6. word","7. word","8. word"))
我需要使用单独的函数分成两列,并将它们重命名为 Numbers
,其他的称为 Words
。我这样做但没有用:
df %>% separate(col = col1 , into = c('Number','Words'), sep = "^. ")
问题是第五个有 2 个点。我不知道如何处理关于正则表达式的问题。
有什么帮助吗?
我不确定如何使用 tidyr
执行此操作,但以下内容应该适用于基础 R
。
df$col1 <- gsub('N. ', '', df$col1)
df$Numbers <- as.numeric(sapply(strsplit(df$col1, ' '), '[', 1))
df$Words <- sapply(strsplit(df$col1, ' '), '[', 2)
df$col1 <- NULL
结果
> head(df)
Numbers Words
1 1 word
2 2 word
3 3 word
4 4 word
5 5 word
6 6 word
tidyverse
方法是先清理数据然后分离。
df %>%
mutate(col1 = gsub("\s.*(?=word)", "", col1, perl=TRUE)) %>%
tidyr::separate(col1, into = c("Number", "Words"), sep="\.")
结果:
# A tibble: 8 x 2
Number Words
<chr> <chr>
1 1 word
2 2 word
3 3 word
4 4 word
5 5 word
6 6 word
7 7 word
8 8 word
我假设您希望保留笨重的“N”。在结果中。为此,我的建议是使用 extract
而不是 separate
:
df %>%
extract(
col = col1 ,
into = c('Number','Words'),
regex = "([0-9]+)\. (.*)")
正则表达式 ([0-9]+)\. (.*)
表示您首先要查找要放在第一列中的数字,然后是一个点和一个 space(\.
) 应该被丢弃,其余的应该放在第二列中。
结果:
# A tibble: 8 × 2
Number Words
<chr> <chr>
1 1 word
2 2 word
3 3 word
4 4 word
5 5 N. word
6 6 word
7 7 word
8 8 word
这是使用 readr
s parse_number
和正则表达式的替代方法:
library(dplyr)
library(readr)
df %>%
mutate(Numbers = parse_number(col1), .before=1) %>%
mutate(col1 = gsub('\d+\. ','',col1))
Numbers col1
<dbl> <chr>
1 1 word
2 2 word
3 3 word
4 4 word
5 5 N. word
6 6 word
7 7 word
尝试 read.table
+ sub
> read.table(text = sub("\.", ",", df$col1), sep = ",")
V1 V2
1 1 word
2 2 word
3 3 word
4 4 word
5 5 N. word
6 6 word
7 7 word
8 8 word