将一列中的字符串拆分为两列

Splitting a string in a column into two columns

我有一个包含字符串的列,例如可以是 Afghanistan2008,但也可以是 Brasil2012。我想创建两个新变量,一个是国家部分,一个是年份部分。

因为字符串的末尾总是有数字,所以我知道字符串应该从右侧而不是左侧拆分的位置。

我从这个开始 link:

并提出:

# ES1 is name of dataset, country is name of column to be split
library(tidyr)
ES1$countryyear<-ES1$country
ES1$countryname<-ES1$country
extract(ES1, country, into = c("countryname", "countryyear"), "(\w+) 
(.*)") 

然而,这只会创建 country 列的 "duplicates",而不会创建其他内容。我也没有收到错误。任何可能出错的建议?

你几乎是对的。 \w 在正则表达式中提取字母和数字,然后另一组就没有任何东西了。您可以使用 [a-zA-Z] 作为一个选项对字母进行分组,更准确地说,最好声明您正在寻找 \d.

的数字

下面的工作解决方案:

ES1 <- data.frame(country = c("Afg2", "Den3"))
tidyr::extract(ES1, country, into = c("name", "year"), "([a-zA-Z]+)(\d+)")

  name year
1  Afg    2
2  Den    3

您可以使用 tidyr::separatesep 使用负数索引:

ES1 <- data.frame(country = c("Afghanistan2008", "Brasil2012"))

library(tidyr)
separate(ES1, country, into = c("countryname", "countryyear"), -5)
#   countryname countryyear
# 1 Afghanistan        2008
# 2      Brasil        2012