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

根据R中矩阵中的数据创建虚拟变量,r,R,我有一个数据框架,包含1000个来自n个不同国家的观测数据。每个国家都有一次以上的观察,每个国家的观察次数不同。 我需要创建一个数字从(1到n-1)的列,每个数字对应一个不同的国家。也就是说,我正在创建一个虚拟变量,我不关心哪个国家有哪个数字。我只需要制作这样的假人。 我的数据是这样的 Region x 1 be1 71615 4 be211 54288 5 be112 51158 6 it213 69856 8 it221 71412 9 uk222 79537 1

我有一个数据框架,包含1000个来自n个不同国家的观测数据。每个国家都有一次以上的观察,每个国家的观察次数不同。 我需要创建一个数字从(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
..    ..    ..
 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
..    ..    ..     ..
每个国家在列区域中都有自己的“代码”,例如beXXXX对应于比利时,ukXXX对应于英国,等等。因此,我想我可以利用列区域中的初始2字母来创建我的假人。我知道命令
grep()
可以完成这项工作,但我需要一个脚本,每当区域的首字母发生变化时,它会自动从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
..    ..    ..
 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”个国家。

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

#  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"
#具有额外行的数据(行号11)

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

#  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"
#具有额外行的数据(行号11)

df使用
gsub的另一个选项是:

gsub('.*(^[a-z]{2}).*','\\1',c('de111', 'de11a','dea11'))
"de" "de" "de"

然后,如前一个答案所示,使用
因子和
作为.integer

使用
gsub
的另一个选项是:

gsub('.*(^[a-z]{2}).*','\\1',c('de111', 'de11a','dea11'))
"de" "de" "de"


然后使用前面答案中显示的
因子
as.integer

请发布示例输入的预期输出…你是对的。我发布了预期的输出。我想强调的是,数据帧是按地区(因此也是按国家)排序的,也就是说,我首先有所有的beXXX观测值,然后是itXXXX,依此类推。也许这可以让事情变得更简单。请发布示例输入的预期输出…你是对的。我发布了预期的输出。我想强调的是,数据帧是按地区(因此也是按国家)排序的,也就是说,我首先有所有的beXXX观测值,然后是itXXXX,依此类推。也许可以利用这个来简化事情。你好。谢谢你的洞察力。然而,我仍然有一个问题。我需要代码只考虑首字母,因为我有如下区域代码:uk218、uk219、uk21a(从1到9,然后是字母)。您提供的代码创建了一个名为(uk)的变量和另一个名为(uka)的变量。我只需要(英国)。关于订单,这并不重要,但对其他人可能有用。谢谢你,你说得对。我有超过1000次的观察结果,但都忘了。将编辑问题。感谢you@Bob现在应该可以了。你只需使用我在答案中输入的示例数据即可,这样我就不必(再次)重新编辑了。@SimonO101。有了你的数据,一切都很好。使用我的regexec(“^[a-z]+”,code.nuts3$Region):无效的'text'参数我想这是我的错:这可能是因为我有这样的代码:de111、de11a和dea11吗?非常感谢。again@Bob注意
read.table
中的
stringsAsFactors
参数<代码>区域
应为字符串,但它被视为一个因子。或者使用
regexec(“^[a-z]+”,as.character(code.nuts3$Region))
Hello。谢谢你的洞察力。然而,我仍然有一个问题。我需要代码只考虑首字母,因为我有如下区域代码:uk218、uk219、uk21a(从1到9,然后是字母)。您提供的代码创建了一个名为(uk)的变量和另一个名为(uka)的变量。我只需要(英国)。关于订单,这并不重要,但对其他人可能有用。谢谢你,你说得对。我有超过1000次的观察结果,但都忘了。将编辑问题。感谢you@Bob现在应该可以了。你只需使用我在答案中输入的示例数据即可,这样我就不必(再次)重新编辑了。@SimonO101。有了你的数据,一切都很好。使用我的regexec(“^[a-z]+”,code.nuts3$Region):无效的'text'参数我想这是我的错:这可能是因为我有这样的代码:de111、de11a和dea11吗?非常感谢。again@Bob注意
read.table
中的
stringsAsFactors
参数<代码>区域
应为字符串,但它被视为一个因子。或者使用
regexec(“^[a-z]+”,as.character(code.nuts3$Region))
+1假设所有国家/地区代码都是两个字母,那么这将相当可靠。请进一步解释“\\1”的用法好吗?感谢您\\1使用正则表达式模式中括号之间的分组。+1假设所有国家/地区代码都是两个字母,这将相当可靠。请您进一步解释“\\1”的用法好吗?感谢您\\1在正则表达式模式中取括号中分组的内容。