R 使用右边的四个字符拆分列

R 使用右边的四个字符拆分列,r,R,我想把一列一分为二。我想选择正确的4个数字,并使其成为自己的列。例如,我有一个列带有“纽约2014”,我想创建两个新列,分别带有“纽约”和“2014” 请注意,我不能简单地在“上划界,因为其他一些观察没有空格或多个空格。假设您的列是data$V1 require(stringr) data$V2 = str_sub(data$V1, 1, -5) data$V3 = str_sub(data$V1, -4, -1) 使用data.table和gsub library(data.table) i

我想把一列一分为二。我想选择正确的4个数字,并使其成为自己的列。例如,我有一个列带有
“纽约2014”
,我想创建两个新列,分别带有
“纽约”
“2014”


请注意,我不能简单地在
上划界,因为其他一些观察没有空格或多个空格。

假设您的列是data$V1

require(stringr)
data$V2 = str_sub(data$V1, 1, -5)
data$V3 = str_sub(data$V1, -4, -1)

使用
data.table
gsub

library(data.table)
info = data.table(
    x = c(
        "New York 2014",
        "New York 2015",
        "New York 2016",
        "Fargo 2014",
        "Fargo 2015",
        "Fargo 2016",
        "San Francisco 2014",
        "San Francisco 2015",
        "San Francisco 2016"
    )
)

##
info[ , c('city','year'):=list( 
    gsub('(\\D+)\\s+(\\d+)','\\1',x), 
    gsub('(\\D+)\\s+(\\d+)','\\2',x)
)]

> info
                    x          city year
1:      New York 2014      New York 2014
2:      New York 2015      New York 2015
3:      New York 2016      New York 2016
4:         Fargo 2014         Fargo 2014
5:         Fargo 2015         Fargo 2015
6:         Fargo 2016         Fargo 2016
7: San Francisco 2014 San Francisco 2014
8: San Francisco 2015 San Francisco 2015
9: San Francisco 2016 San Francisco 2016

不要使用
:=
如果您不想保留列
x
我们可以使用
tstrsplit
from
data.table

library(data.table)
setDT(df)[, setNames(tstrsplit(x, '\\s(?=\\d{4}$)', 
             perl=TRUE), c('City', 'Year'))]
#               City Year
#1:         New York 2014
#2:          Houston 2012
#3: Lake Havasu City 2016
read.table(text=sub('(\\D+)\\s(\\d+)', '\\1,\\2', 
     df$x),sep=",", header=FALSE, stringsAsFactors=FALSE, 
        col.names=c('City', 'Year'))
#              City Year
#1         New York 2014
#2          Houston 2012
#3 Lake Havasu City 2016

或者,
base R
选项是使用
sub
在城市和年份之间创建一个分隔符,然后使用
read.table

library(data.table)
setDT(df)[, setNames(tstrsplit(x, '\\s(?=\\d{4}$)', 
             perl=TRUE), c('City', 'Year'))]
#               City Year
#1:         New York 2014
#2:          Houston 2012
#3: Lake Havasu City 2016
read.table(text=sub('(\\D+)\\s(\\d+)', '\\1,\\2', 
     df$x),sep=",", header=FALSE, stringsAsFactors=FALSE, 
        col.names=c('City', 'Year'))
#              City Year
#1         New York 2014
#2          Houston 2012
#3 Lake Havasu City 2016
数据
df查看
?substr
?nchar