我有一个数据框,其中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
.. .. ..
每个国家/地区都有自己的“代码”,例如beXXXX对比利时,ukXXX对英国等等。因此,我想我可以利用列Region中的初始 2 字母来创建我的假人。我从here知道命令grep()
可以完成这项工作,但我需要有一个脚本,只要该区域的首字母发生变化,该脚本就会自动从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
.. .. .. ..
在这种情况下,1对应于“be”(比利时),2对应于“it”(意大利),依此类推,对于我样本中的'n'国家。
答案 0 :(得分: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"
答案 1 :(得分:2)
使用gsub
的另一个选项是:
gsub('.*(^[a-z]{2}).*','\\1',c('de111', 'de11a','dea11'))
"de" "de" "de"
然后您使用factor
和as.integer
,如上一个答案所示。