数据样本:
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"
))