【问题标题】:Loop to create dummy variable R循环创建虚拟变量 R
【发布时间】:2013-06-12 16:40:39
【问题描述】:

我正在尝试使用基于变量最频繁响应的循环生成虚拟变量(必须为 1/0)。经过大量的谷歌搜索,我还没有想出一个解决方案。我使用

提取了最常见的响应(字符串,比如前 5 个是“A”、“B”、...、“E”)

top5<-names(head(sort(table(data$var1), decreasing = TRUE),5)

我希望循环检查另一个变量(“var2”)是否等于 A,如果是,则设置 =1,OW =0,然后使用聚合()给出摘要。在 Stata 中,我可以使用 `i' 来引用循环变量 i,但在 R 中则不行...不起作用的代码是:

for(i in top5) {
   data$i.dummy <- ifelse(data$var2=="i",1,0)
   aggregate(data$i.dummy~data$age+data$year,data,mean)
}

有什么建议吗?

【问题讨论】:

  • 为什么i 周围有引号?您将 var2 与字符 "i" 进行比较,而不是变量 i... 而且,比 ifelse 更快的是 as.integer(data$var2==i)
  • 下面是您要找的东西吗?如果不是,请添加一些有关您希望做什么的详细信息。

标签: r loops


【解决方案1】:

如果您希望前 5 名中的每个项目有一列,那么我会在 top5 中的元素旁边使用 sapply。不需要ifelse,因为== 比较并给出TRUE,如果比较结果为TRUE,则为1,否则为0

这里我们 cbind 一个 5 列的矩阵,如果 data$var2 中的行等于 'top5' 的相应元素,则每个 top5 的每个元素都包含 1:

data <- cbind( data , sapply( top5 , function(x) as.integer( data$var2 == x ) ) )

如果您想要一列匹配任何top5,那就更简单了:

data$dummies <- as.integer( data$var2 %in% top5 )

as.integer() 在这两种情况下都用于将TRUEFALSE 分别转换为10

一个简化的例子来说明它是如何工作的:

set.seed(123)
top2 <- c("A","B")
data <- data.frame( var2 = sample(LETTERS[1:4],6,repl=TRUE) )

#  Make dummy variables, one column for each element in topX vector
data <- cbind( data , sapply( top2 , function(x) as.integer( data$var2 == x ) ) )
data
#  var2 A B
#1    B 0 1
#2    D 0 0
#3    B 0 1
#4    D 0 0
#5    D 0 0
#6    A 1 0

#  Make single column for all elements in topX vector
data$ANY <- as.integer( data$var2 %in% top2 )
data
#  var2 ANY A B
#1    B   1 0 1
#2    D   0 0 0
#3    B   1 0 1
#4    D   0 0 0
#5    D   0 0 0
#6    A   1 1 0

【讨论】:

    【解决方案2】:

    查看fortune(312),然后阅读帮助?"[[",可能还有paste0 的帮助。

    然后可能考虑使用其他工具,例如 model.matrixsapply,而不是使用循环自己做所有事情。

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 2021-08-03
      • 2023-03-24
      • 2018-03-31
      • 2016-04-24
      • 2013-09-23
      • 2023-03-27
      • 2022-11-10
      • 2021-07-20
      相关资源
      最近更新 更多