[英]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.