2015-02-23 46 views
0

我試圖用sapply而不是'for'循環,但是我沒有得到我期待的結果,我測試了每行分隔,代碼正在工作,但是當我使用sapply不是。我在尋找什麼可能是錯誤的一些提示:R中的sapply函數沒有給我想要的結果

event <- c('Astronomical Low Tide', 'Avalanche', 'Blizzard', 'Coastal Flood', 
      'Cold/Wind Chill', 'Debris Flow', 'Dense Fog', 'Dense Smoke', 'Drought', 
      'Dust Devil', 'Dust Storm','Excessive Heat', 'Extreme Cold/Wind Chill', 
      'Flash Flood', 'Flood', 'Frost/Freeze', 'Funnel Cloud', 'Freezing Fog', 
      'Hail', 'Heat', 'Heavy Rain', 'Heavy Snow', 'High Surf', 'High Wind', 
      'Hurricane/Typhoon', 'Ice Storm', 'Lake/Effect Snow', 'Lakeshore Flood', 
      'Lightning', 'Marine Hail', 'Marine High Wind', 'Marine Strong Wind', 
      'Marine Thunderstorm Wind', 'Rip Current', 'Seiche', 'Sleet', 
      'Storm Surge/Tide', 'Strong Wind', 'Thunderstorm Wind', 'Tornado', 
      'Tropical Depression', 'Tropical Storm', 'Tsunami', 'Volcanic Ash', 
      'Waterspout', 'Wildfire', 'Winter Storm', 'Winter Weather') 

replace <- function(dt, x, col) { 
    idx <- grep(paste('(?i)', event[x], sep = ''), dt[, col]) 
    dt[idx, col] <- event[x] 
} 

sapply(1:length(event), function(x) replace(stormdata, x, 8)) 

基本上,我想要做的是使用在event變量中的每個值作爲圖案的grep函數內的定製replace函數,然後我得到匹配我的模式的行的索引,並將它們存儲在idx變量中。之後,我想用event變量中包含的值替換數據框中對應於idx值的行。

我試圖創建一個sapply功能的循環使用對event變量的每一個值,所以我想一個循環,變爲48倍於第8欄尋找數據幀stormdata每個模式和替換它們。但我的代碼什麼也沒做,運行後數據保持不變,沒有替換。當我在沒有sapply的情況下單獨運行每條線路時,它都能正常工作。

我到處尋找,我找不到爲什麼不工作。幫幫我。

+1

如果您還包含一個樣本'stormdata'對象以使您的示例[reproducible]更有用(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-可再現-例子)。一般來說,使用函數式編程語言你不會期望你的函數有副作用。如果你想改變一個對象,你的函數應該返回一個新的,更新的對象,而不是嘗試編輯現有的對象。當您在函數中編輯變量時,這些更改通常只在該函數內可見,並在函數終止時消失。 – MrFlick 2015-02-23 03:50:23

+0

查看'sapply(。)'調用的唯一方法是將結果賦值給一個符號。在R的早期努力中將其分配回'stormdata'是相當危險的,但爲什麼不將它分配給'stormtemp'然後再看它? – 2015-02-23 04:42:20

回答

0

嘗試在您的功能中使用全局分配,例如stormdata[idx, col] <<- event[x]。不乾淨,但可能會工作。

相關問題