2013-06-12 241 views
4

我正在尝试使用基于变量最频繁响应的循环生成虚拟变量(必须为1/0)。大量的谷歌搜索后,我没有设法提出解决方案。我已经提取的最常见的反应(字符串,说前5名是“A”,“B”,......,“E”)使用循环创建虚拟变量R

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

我想循环检查另一变量(“var2”)等于A,如果设置为1,OW = 0,则使用aggregate()给出摘要。在Stata,我可以参考我使用环形变量'我”,但不是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

+0

下面是你要找的?如果不是,请添加一些关于你希望做什么的细节。 –

回答

4

如果你想在你的排名前5的每个项目一列,那么我会沿着top5中的元素使用sapply。不需要ifelse因为==进行比较,并给出TRUE或1,如果比较结果为TRUE,否则为0

在这里,我们cbind 5列的矩阵,每一个为含有1 top5每个元素,如果在data$var2行等于相应'TOP5' 的元素:

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,而不是自己使用循环做所有事情。

+0

+1用于创意自我引用;-)。 – gung