我试图使用基于变量最频繁响应的循环来生成虚拟变量(必须是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)
}
有什么建议吗?
答案 0 :(得分:5)
如果您希望前五名中的每个项目都有一列,那么我会在sapply
中的元素中使用top5
。不需要ifelse
,因为==
比较并给出TRUE
或者如果比较为TRUE则为1,否则为0
这里我们cbind一个包含5列的矩阵,如果top5
中的行等于'top5'的相应元素,则data$var2
的每个元素各占一个,包含1:
data <- cbind( data , sapply( top5 , function(x) as.integer( data$var2 == x ) ) )
如果你想要一列用于任何top5
的匹配,那就更容易了:
data$dummies <- as.integer( data$var2 %in% top5 )
两种情况下的as.integer()
分别用于将TRUE
或FALSE
变为1
和0
。
一个简短的例子来说明它的工作原理:
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
答案 1 :(得分:5)
请参阅fortune(312)
,然后阅读帮助?"[["
以及paste0
的帮助。
然后可能考虑使用其他工具,如model.matrix
和sapply
,而不是自己使用循环。