使用单独的仅考虑 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 

这是使用 readrs 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