根据R中矩阵中的数据创建虚拟变量

Bob*_*Bob 1 grep r

我有一个数据框,有1000个观察属于n个不同的国家.每个国家有超过1个观察,每个国家的观察数量不同.我需要创建一个数字从(1到n-1)的列,每个数字对应一个不同的国家.也就是说,我正在创建一个虚拟变量,我不关心哪个国家/地区有哪个数字.我只需要创造这样的假人.我的数据是这样的

  Region     x
1    be1 71615
4  be211 54288
5  be112 51158
6  it213 69856
8  it221 71412
9  uk222 79537
10 de101 94827
11 de10a 98273
12 dea10 92827
..    ..    ..
Run Code Online (Sandbox Code Playgroud)

每个国家/地区在列区域中都有自己的"代码",例如beXXXX与比利时相关,ukXXX与英国相关,依此类推.因此,我想我可以利用列Region中的最初2个字母来创建我的假人.我从这里知道命令grep()可以完成这项任务,但我需要有一个脚本,只要Region的首字母发生变化,它就会自动从1切换到n-1.

预期的输出应该是这样的

 Region     x   Dummy
1    be1 71615      1
4  be211 54288      1
5  be112 51158      1
6  it213 69856      2
8  it221 71412      2
9  uk222 79537      3
10 de101 94827      4
11 de10a 98273      4
12 dea10 92827      4
..    ..    ..     ..
Run Code Online (Sandbox Code Playgroud)

在这种情况下,1对应于"be"(比利时),2对应于"it"(意大利),依此类推,对于我的样本中的'n'国家.

Sim*_*lon 5

如何创建因子变量(您可以显示基础整数代码as.integer).我们使用regexec和regmatches提取出现在Region变量开头的字母代码(忽略稍后出现的字母)并将它们转换为因子...

#  Data with an extra row (row number 11)
df <- read.table( text = "  Region     x
1    be1 71615
4  be211 54288
5  be112 51158
6  it213 69856
8  it221 71412
9  uk222 79537
11  uk222a 79537
10 de101 94827" , h = T , stringsAsFactors = FALSE )

levs <- regmatches( df$Region , regexec( "^[a-z]+" , df$Region ) )

df$Country <- as.integer( factor( levs , levels = unique(levs ) ) )

   Region     x Country
1     be1 71615       1
4   be211 54288       1
5   be112 51158       1
6   it213 69856       2
8   it221 71412       2
9   uk222 79537       3
11 uk222a 79537       3
10  de101 94827       4

unlist( regmatches( df$Region , regexec( "^[a-z]+" , df$Region ) ) )
[1] "be" "be" "be" "it" "it" "uk" "uk" "de"
Run Code Online (Sandbox Code Playgroud)