r语言 - 在 tidyr 中使用 separate 来分隔一定数量的字符后的列?



数据样本:

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

我有点不确定如何在tidyr包提供的separate函数中使用sep参数。我仍然是使用正则表达式的新手,但我认为这样的事情会起作用:

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"
))

最新更新