2016-11-22 63 views
0

我的問題是關於警告我有時得到的代碼。警告是r數據表地圖警告'更長的參數不是一個更短的長度的倍數'

Warning message: 
In mapply(FUN = f, ..., SIMPLIFY = FALSE) : 
    longer argument not a multiple of length of shorter 

這個想法看起來很簡單。我想將列名稱向量(cn)的每一行中的值與另一列中同一行中的值相乘,並用新值替換cn列。我正在構建加權和。重量是foodAvailRatio。

dt.temp <- readRDS("xxx") 
cn <- c("usda_code", "item", "foodAvailRatio","item_name", "usda_desc", "IMPACT_code", "Ref_Desc", "RetnDesc", "retentioncode_aus") 
cm <- names(dt.temp)[!names(dt.temp) %in% cn] 
# multiply all the columns in cm by foodAvailRatio and assign to the cm columns 
dt.temp[, (cm) := Map(`*`, mget(cm), foodAvailRatio)] 

利用這種替換(dt.cocer.rds)爲XXX,不獲取錯誤。與不同的一個(dt.vege.rds)我得到的錯誤。這兩個具有長度52對於這兩個總和(foodAvailRatio)= 1

我與微軟開放訴3.3.1在Mac上做這RStudio

+1

'readRDS'在'dt.temp'上調用'setDT',存儲在磁盤上失去了預先分配的列。記錄在[FAQ](http://jangorecki.gitlab.io/data.table/library/data.table/doc/datatable-faq.html#reading-data.table-from-rds-or-rdata-file) 。不知道這是否是這個問題。 – jangorecki

+0

除了Michael的回答,在製作'cm'時可以考慮的另一個調整:setdiff(x,y)'可以用來代替'x [!x%in%y]'。 – Frank

回答

2

我相信你試圖通過foodAvailRatio

乘以所有cm列試試這個:

dt.temp[ , (cm) := lapply(.SD, `*`, foodAvailRatio), .SDcols = cm] 

注意,使用foodAvailRatio這樣就需要開發版本(安裝說明here),因爲它不是在.SDcols

在1.9.6(目前在CRAN上),您可以用dt.temp$foodAvailRatio替換foodAvailRatio

相關問題