将一列中的字符串拆分为两列
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::separate
为 sep
使用负数索引:
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
我有一个包含字符串的列,例如可以是 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::separate
为 sep
使用负数索引:
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