4

我正在尝试使用基于变量最频繁响应的循环生成虚拟变量(必须为 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)
}

有什么建议么?

4

2 回答 2

6

如果您希望前 5 名中的每个项目都有一列,那么我将sapply使用top5. 不需要,ifelse因为==比较并给出TRUE或如果比较为 TRUE,则为 1,否则为 0

top5在这里,我们 cbind 一个 5 列的矩阵,如果 in 中的行data$var2等于 '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
于 2013-06-12T16:59:20.323 回答
5

请参阅fortune(312),然后阅读帮助?"[["和可能的帮助paste0

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

于 2013-06-12T18:14:27.963 回答