代码之家  ›  专栏  ›  技术社区  ›  Laura

拆分列时只考虑R中的第一个点,使用单独的

  •  0
  • Laura  · 技术社区  · 2 年前

    这是我的数据帧:

    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个点。我不知道如何处理正则表达式。

    有什么帮助吗?

    0 回复  |  直到 2 年前
        1
  •  4
  •   TarJae    2 年前

    这里有一个使用的替代方案 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   
    
        2
  •  3
  •   NelsonGon phoxis    2 年前

    a. 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 
    
        3
  •  3
  •   Vincent Guillemot    2 年前

    我假设您希望在结果中保留繁琐的“N”。为此,我的建议是使用 extract 而不是 separate :

    df %>% 
      extract(
        col = col1 ,
        into = c('Number','Words'), 
        regex = "([0-9]+)\\. (.*)")
    

    正则表达式 ([0-9]+)\\. (.*) 意思是你首先要找一个数字,你想把它放在第一列,后面跟着一个点和一个空格( \\. )那应该被丢弃,剩下的应该放在第二列中。

    结果:

    # 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 
    
        4
  •  3
  •   ThomasIsCoding    2 年前

    尝试 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
    
        5
  •  2
  •   Dion Groothof    2 年前

    我不知道如何用 tidyr ,但以下内容应适用于base 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