2013-06-12 131 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