循环创建虚拟变量R.

kir*_*irk 4 loops r

我试图使用基于变量的最频繁响应的循环来生成虚拟变量(必须是1/0).经过大量的谷歌搜索,我还没有设法找到解决方案.我已经提取了最频繁的响应(字符串,比如说前五名是"A","B",......,"E")

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

我想循环检查另一个变量("var2")是否等于A,如果这样设置= 1,OW = 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)
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Sim*_*lon 5

如果您希望前5名中的每一项都包含一列,那么我将使用中sapply的元素top5。不需要,ifelse因为==进行比较并给出TRUE,如果比较为TRUE则为1,否则为0

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

data <- cbind( data , sapply( top5 , function(x) as.integer( data$var2 == x ) ) )
Run Code Online (Sandbox Code Playgroud)

如果您希望使用一列来匹配任何一个,top5则更加简单:

data$dummies <- as.integer( data$var2 %in% top5 )
Run Code Online (Sandbox Code Playgroud)

as.integer()这两种情况下用于开启TRUEFALSE10分别。

一个简化的示例以说明其工作方式:

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
Run Code Online (Sandbox Code Playgroud)


Gre*_*now 5

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

然后可能考虑使用其他工具model.matrix,sapply而不是自己使用循环.