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
的情況下單獨運行每條線路時,它都能正常工作。
我到處尋找,我找不到爲什麼不工作。幫幫我。
如果您還包含一個樣本'stormdata'對象以使您的示例[reproducible]更有用(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-可再現-例子)。一般來說,使用函數式編程語言你不會期望你的函數有副作用。如果你想改變一個對象,你的函數應該返回一個新的,更新的對象,而不是嘗試編輯現有的對象。當您在函數中編輯變量時,這些更改通常只在該函數內可見,並在函數終止時消失。 – MrFlick 2015-02-23 03:50:23
查看'sapply(。)'調用的唯一方法是將結果賦值給一個符號。在R的早期努力中將其分配回'stormdata'是相當危險的,但爲什麼不將它分配給'stormtemp'然後再看它? – 2015-02-23 04:42:20