根据R中矩阵中的数据创建虚拟变量
我有一个数据框架,包含1000个来自n个不同国家的观测数据。每个国家都有一次以上的观察,每个国家的观察次数不同。 我需要创建一个数字从(1到n-1)的列,每个数字对应一个不同的国家。也就是说,我正在创建一个虚拟变量,我不关心哪个国家有哪个数字。我只需要制作这样的假人。 我的数据是这样的根据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
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在正则表达式模式中取括号中分组的内容。