循环创建虚拟变量 R

4

我想使用循环生成虚拟变量(必须为1/0),并基于一个变量的最常见响应。经过大量搜索,我仍未能找到解决方案。我已提取出最常见的响应(字符串,例如前5个是"A"、"B"等):

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

我希望循环检查另一个变量("var2")是否等于A,如果是则设置为1,否则为0,然后使用aggregate()给出总结。在Stata中,我可以使用`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)
}

有什么建议吗?

2
为什么你在 i 周围加引号?你正在将 var2 与字符 "i" 进行比较而不是变量 i... 同样,比 ifelse 更快的方法是 as.integer(data$ var2==i) - Justin
以下内容是否符合您的要求?如果不是,请详细说明您希望做什么。 - Simon O'Hanlon
2个回答

6
如果您希望在您的前五项中每个项目有一列,则可以使用sapply函数遍历top5列表。因为==用于比较并返回TRUE或1(如果比较结果为真),否则返回0,所以不需要使用ifelse函数。
在这里,我们使用cbind将一个包含5列的矩阵与top5中的每个元素绑定在一起,其中每一行对应于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

5

看一下 fortune(312),然后阅读帮助文档?"[[",还可以考虑阅读paste0的帮助文档。

接着,可以考虑使用其他工具来代替循环,比如model.matrixsapply


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接