有没有办法从 R 中现有的列名生成年份列?
Is there any way to generate year column from existing column names in R?
我正在使用一个数据集,该数据集将相应的年份附加到变量名称作为后缀,例如AXOX1991,其中 AXO 是变量。我试图将年份与变量 label/column 名称分开以生成年份列,以便可以将数据集作为时间序列数据进行分析。
换句话说,现有数据集如下所示:
国家
AXOX1991
AXOX1992
BXOX1991
BXOX1992
CXOX1991
CXOX1992
阿富汗
1
2
3
4
5
6
美国
6
5
4
3
2
1
我正在尝试创建以下内容:
国家
年
AXO
BXO
CXO
阿富汗
1991
1
3
5
阿富汗
1992
2
4
6
美国
1991
6
4
2
美国
1992
5
3
1
如您所见,X不仅是变量名和年份的分隔符,也是变量名的一部分。在 R 中有什么方法可以将年份与现有列名称中的变量名称分开,然后创建如上所示的年份列?
我一直在考虑解决方法,例如循环,但我还没有走得很远,我真的很困惑。我有 900 多个可变年,所以我想尽可能避免手工完成。
谢谢!
你可以利用tidyr::pivot_longer
-
res <- tidyr::pivot_longer(df, cols = -Country,
names_to = c('.value', 'Year'),
names_pattern = '([A-Z]+)X(\d+)')
res
# Country Year AXO BXO CXO
# <chr> <chr> <int> <int> <int>
#1 Afghanistan 1991 1 3 5
#2 Afghanistan 1992 2 4 6
#3 USA 1991 6 4 2
#4 USA 1992 5 3 1
数据
df <- structure(list(Country = c("Afghanistan", "USA"), AXOX1991 = c(1L,
6L), AXOX1992 = c(2L, 5L), BXOX1991 = 3:4, BXOX1992 = 4:3, CXOX1991 = c(5L,
2L), CXOX1992 = c(6L, 1L)), class = "data.frame", row.names = c(NA, -2L))
为了完整起见,这里有一个使用 melt()
和新 measure()
函数(随 data.table
v1.14.1 引入)的解决方案:
library(data.table) # development version 1.14.1
melt(setDT(df), measure.vars = measure(value.name, year,
pattern = "(\w{3})X(\d{4})"))
Country year AXO BXO CXO
1: Afghanistan 1991 1 3 5
2: USA 1991 6 4 2
3: Afghanistan 1992 2 4 6
4: USA 1992 5 3 1
数据
library(data.table)
df <- fread("Country AXOX1991 AXOX1992 BXOX1991 BXOX1992 CXOX1991 CXOX1992
Afghanistan 1 2 3 4 5 6
USA 6 5 4 3 2 1")
我正在使用一个数据集,该数据集将相应的年份附加到变量名称作为后缀,例如AXOX1991,其中 AXO 是变量。我试图将年份与变量 label/column 名称分开以生成年份列,以便可以将数据集作为时间序列数据进行分析。
换句话说,现有数据集如下所示:
国家 | AXOX1991 | AXOX1992 | BXOX1991 | BXOX1992 | CXOX1991 | CXOX1992 |
---|---|---|---|---|---|---|
阿富汗 | 1 | 2 | 3 | 4 | 5 | 6 |
美国 | 6 | 5 | 4 | 3 | 2 | 1 |
我正在尝试创建以下内容:
国家 | 年 | AXO | BXO | CXO |
---|---|---|---|---|
阿富汗 | 1991 | 1 | 3 | 5 |
阿富汗 | 1992 | 2 | 4 | 6 |
美国 | 1991 | 6 | 4 | 2 |
美国 | 1992 | 5 | 3 | 1 |
如您所见,X不仅是变量名和年份的分隔符,也是变量名的一部分。在 R 中有什么方法可以将年份与现有列名称中的变量名称分开,然后创建如上所示的年份列?
我一直在考虑解决方法,例如循环,但我还没有走得很远,我真的很困惑。我有 900 多个可变年,所以我想尽可能避免手工完成。
谢谢!
你可以利用tidyr::pivot_longer
-
res <- tidyr::pivot_longer(df, cols = -Country,
names_to = c('.value', 'Year'),
names_pattern = '([A-Z]+)X(\d+)')
res
# Country Year AXO BXO CXO
# <chr> <chr> <int> <int> <int>
#1 Afghanistan 1991 1 3 5
#2 Afghanistan 1992 2 4 6
#3 USA 1991 6 4 2
#4 USA 1992 5 3 1
数据
df <- structure(list(Country = c("Afghanistan", "USA"), AXOX1991 = c(1L,
6L), AXOX1992 = c(2L, 5L), BXOX1991 = 3:4, BXOX1992 = 4:3, CXOX1991 = c(5L,
2L), CXOX1992 = c(6L, 1L)), class = "data.frame", row.names = c(NA, -2L))
为了完整起见,这里有一个使用 melt()
和新 measure()
函数(随 data.table
v1.14.1 引入)的解决方案:
library(data.table) # development version 1.14.1
melt(setDT(df), measure.vars = measure(value.name, year,
pattern = "(\w{3})X(\d{4})"))
Country year AXO BXO CXO 1: Afghanistan 1991 1 3 5 2: USA 1991 6 4 2 3: Afghanistan 1992 2 4 6 4: USA 1992 5 3 1
数据
library(data.table)
df <- fread("Country AXOX1991 AXOX1992 BXOX1991 BXOX1992 CXOX1991 CXOX1992
Afghanistan 1 2 3 4 5 6
USA 6 5 4 3 2 1")