【问题标题】:Creating a dummy variable according to data in a matrix in R根据R中矩阵中的数据创建虚拟变量
【发布时间】:2013-09-16 10:30:08
【问题描述】:

我有一个数据框,其中包含属于 n 个不同国家的 1000 个观察值。每个国家有超过 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”个国家/地区。

【问题讨论】:

  • 请从您的示例输入中发布预期输出...
  • 你是对的。我发布了预期的输出。我想强调的是,数据框是按地区(因此按国家)排序的,也就是说,我首先拥有所有 beXXX 观察结果,然后是 itXXXX 等等。也许可以利用这一点使事情变得更简单。

标签: r


【解决方案1】:

如何创建一个因子变量(您可以使用as.integer 显示底层整数代码)。我们使用regexecregmatches 来提取出现在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"

【讨论】:

  • 你好。谢谢你的洞察力。但是,我仍然有一个问题。我需要代码只考虑首字母,因为我的区域代码如下:uk218、uk219、uk21a(从 1 到 9,然后 siwtches 到字母)您提供的代码创建了一个名为 (uk) 的变量和另一个名为(uka)。我只需要(英国)。关于订单,这并不是很重要,但它可以对其他人有用。谢谢
  • 你是对的。我有> 1000个观察结果并忘记了它。要去编辑问题。谢谢
  • @Bob 现在应该可以工作了。您可以只使用我在答案中输入的示例数据 - 它可以让我不必重新编辑(再次!)。
  • @SimonO101。有了你的数据,一切都很好。在我的情况下,我在 regexec("^[a-z]+", code.nuts3$Region) 中遇到此错误:无效的 'text' 参数我想这是我的错:可能是因为我有这种代码:de111、de11a 和 dea11 ?再次感谢您
  • @Bob 注意read.table 中的stringsAsFactors 参数。 Region 应该是一个字符串,但它被视为一个因素。或者使用regexec("^[a-z]+", as.character( code.nuts3$Region ) )
【解决方案2】:

使用gsub 的另一个选项是:

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

然后您使用factoras.integer,如上一个答案所示。

【讨论】:

  • +1 这将是相当可靠的,假设所有国家代码都是两个字母。
  • 你能进一步解释一下'\\1'的用法吗?谢谢
  • \\1 获取正则表达式模式中括号之间分组的内容。
猜你喜欢
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多