如何在tidyverse中使用separate来分割列?

1 r dplyr tidyr tidyverse

我使用separate()函数来拆分列:Enterdateofexam2,它是字符格式,值类似于“25.07”,“13.09”,“16.06”...我的目标是将其拆分为天(25)和月(07),然后使用convert = true 将它们转换为数字以供下一步过滤。

我的代码是:

jimma3n <- jimma3 %>%
        select(Enterdateofexam2, Enterdayofexam, UniqueKey,MEDICALRECORD)%>%
        separate(Enterdateofexam2,into=c("day", "month"), sep=".", convert = TRUE)
view (jimma3n)
Run Code Online (Sandbox Code Playgroud)

但 R 不断警告我:

Expected 2 pieces. Additional pieces discarded in 4088 rows [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...].
Run Code Online (Sandbox Code Playgroud)

那么有人可以帮助找出我的代码的哪一部分是错误的吗?谢谢~~!

akr*_*run 5

我们可以使用extra论证。另外,默认情况下,sep处于regex模式 - 根据?separate文档

sep - 如果是字符,则 sep 被解释为正则表达式。默认值是匹配任何非字母数字值序列的正则表达式。

and.是一个元字符,可以匹配任何字符。因此,我们可能需要转义 ( \\.) 或将其放在方括号 ( [.]) 中。另外,基于dput,该列是 a listunnest在执行之前应先对其进行编辑separate

library(dplyr)
library(tidyr)
jimma3 %>%
      select(Enterdateofexam2, Enterdayofexam, UniqueKey,MEDICALRECORD)%>%
      unnest(Enterdateofexam2) %>%
      separate(Enterdateofexam2,into=c("day", "month"), 
              sep="\\.", convert = TRUE, extra = "merge") %>% 
      na.omit
Run Code Online (Sandbox Code Playgroud)

-输出

# A tibble: 6 x 5
    day month Enterdayofexam UniqueKey MEDICALRECORD
  <int> <int> <chr>          <chr>     <chr>        
1     7     6 1              530       577207       
2     8     6 2              530       577207       
3     9     6 3              530       577207       
4     2    12 1              531       575333       
5     3    12 2              531       575333       
6     4    12 3              531       575333       
Run Code Online (Sandbox Code Playgroud)

基本上,对于sep = ".",它在每个字符元素处分裂,因此弹出警告

数据

jimma3 <- structure(list(Enterdateofexam2 = list(c("", "7.06"), c("", "8.06"
), c("", "9.06"), c("", "2.12"), c("", "3.12"), c("", "4.12")), 
    Enterdayofexam = c("1", "2", "3", "1", "2", "3"), UniqueKey = c("530", 
    "530", "530", "531", "531", "531"), MEDICALRECORD = c("577207", 
    "577207", "577207", "575333", "575333", "575333")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)