2011-12-22 45 views
2

我有一個大約50,000 X 200的數據框。列名是4種不同的類型,其末尾的數字範圍從1-50(store1,price1,time1,rate1,store2, price2,time2,rate2,...,store50,price50,time50,rate50)。我試圖根據每列的值創建虛擬變量,但是無法讓R處理循環內的列名。R處理for循環中的列名稱

store1 price1  time1  rate1  store2  price2 time2  rate2 .... 
    A  55.55  08:09  1.44  B   44.44  11:09  1.46 
    C  55.55  08:09  1.44  G   44.44  11:09  1.46 
    X  55.55  08:09  1.44  E   44.44  11:09  1.46 
    D  55.55  08:09  1.44  S   44.44  11:09  1.46 

這是我迄今爲止嘗試過的,沒有運氣。

xform_data <- function(x) { 
     for(i in 1:50){ 
     storeX <- (paste("store",i,sep="")) 
     storeX2 <- ifelse(storeX == "A", 1, 2) 
     x <- cbind(x, storeX2 ) 
     } 
    x  
} 

有什麼建議嗎?

回答

3

下比較名稱而不是比較值:

ifelse(storeX == "A", ... 

嘗試:

ifelse(x[,storeX] == "A", ... 

此外,所有新列將被稱爲storeX2。你可能更願意將其重命名:

x <- cbind(x, storeX2) 
colnames(x)[length(colnames(x))] <- storeX2 

(我相信存在更優雅的方式來做到這一點。)

+0

這樣做。非常感謝你! – screechOwl 2011-12-22 16:17:54

+0

感謝命名的想法。這是我的下一個問題:) – screechOwl 2011-12-22 16:24:38

+0

@screechOwl:不客氣。我很高興我的精神力量已經派上用場了;-) – NPE 2011-12-22 16:27:48

1

@aix給適當的方式與一個循環做到這一點,但是你會發現它更快或更容易使用其他工具,具體取決於你想要的最終結果。像sapplylapply這樣的函數可用於以同樣的方式處理數據幀(或數據幀的子集)的每一列。 model.matrix函數將一步將變量轉換爲虛擬變量(0和1)。其他可能有助於包括因素的工具,switchmatch