繁体   English   中英

在tidyr中使用分隔符以在一定数量的字符后分隔列?

[英]Using separate in tidyr to separate column after a certain number of characters?

数据样本:

  Outcome            
  <chr>              
1 X2016-17Denominator
2 X2014-15Denominator
3 X2014-15Outcome    
4 X2010-11Numerator  
5 X2012-13Denominator

我有点不确定如何在tidyr包提供的separate函数中使用sep参数。 我仍然是使用regex的新手,但我发现这样可以工作:

sample %<>% separate(Outcome, into=c("date", "metric"), sep="^X[:digit:]{4}[:punct:][:digit:]{2}")

这样可以很好地创建metric列,但将日期列留空。 我猜测问题是没有复制被认为是“分隔符”的内容,但是我不确定如何指定X####-##之后的字符作为我希望分隔列的字符。

您可以按职位分开。

library(tidyr)

dat %>%
  separate(Outcome, into=c("date", "metric"), sep = 8)
#       date      metric
# 1 X2016-17 Denominator
# 2 X2014-15 Denominator
# 3 X2014-15     Outcome
# 4 X2010-11   Numerator
# 5 X2012-13 Denominator

数据

dat <- read.table(text = "  Outcome            
1 'X2016-17Denominator'
2 'X2014-15Denominator'
3 'X2014-15Outcome'    
4 'X2010-11Numerator'  
5 'X2012-13Denominator'",
                  header = TRUE, stringsAsFactors = FALSE)

separate用于在给定分隔符的情况下分隔列(因此,您将正则表达式用作分隔符,因此仅保留metric ,因为它认为其余部分应分隔列)。 在这种情况下,您应该使用extract

sample = data.frame(Outcome = c(
    'X2016-17Denominator', 
    'X2014-15Denominator',
    'X2014-15Outcome',
    'X2010-11Numerator',
    'X2012-13Denominator'
))

sample %>% 
    extract(
        Outcome, 
        into=c("date", "metric"),
        regex="^X([:digit:]{4}[:punct:][:digit:]{2})(.*)"
    )
#    date      metric
#1 2016-17 Denominator
#2 2014-15 Denominator
#3 2014-15     Outcome
#4 2010-11   Numerator
#5 2012-13 Denominator

我们还可以一个正则表达式环视来separate

library(tidyverse)
df1 %>%
    mutate(Outcome = str_remove(Outcome, "^X")) %>% 
    separate(Outcome, into = c("date", "metric"), sep="(?<=[0-9])(?=[A-Z])")
#     date      metric
#1 2016-17 Denominator
#2 2014-15 Denominator
#3 2014-15     Outcome
#4 2010-11   Numerator
#5 2012-13 Denominator

数据

df1 <- structure(list(Outcome = c("X2016-17Denominator", "X2014-15Denominator", 
 "X2014-15Outcome", "X2010-11Numerator", "X2012-13Denominator"
 )), class = "data.frame", row.names = c("1", "2", "3", "4", "5"
 ))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM