2016-11-22 5 views
0

私の質問は警告に関するものです時々コードを取得します。警告はrデータテーブルマップの警告「より長い引数は長さの短い倍数ではありません」

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

と思われます。私は、別の列の同じ行にある列名(cn)のベクトルの各行の値を複数倍にし、cn列を新しい値で置き換えたいとします。私は加重合計を構成しています。体重はfoodAvailRatioです。この置換(xxxのためdt.cocer.rds)

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)] 

は、エラーを得ることはありません。別の1( dt.vege.rds)私はエラーを取得している。どちらも、両方の合計のために長さ52を持っている(foodAvailRatio)= 1

。?私はMac上のMicrosoftのオープンRのV 3.3.1で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

マイケルの答えに加えて、 'cm 'を作るときに考慮すべきもう一つの調整が' x [!x%in%y] 'の代わりに' setdiff(x、y) 'を使うことができます。 – Frank

答えて

2

私はあなたがこれを試してみてくださいfoodAvailRatio

により、すべてのcm列を乗算しようとしていると信じて:

それは .SDcolsではありませんので、このよう foodAvailRatioを使用すると、開発版(インストール手順 here)が必要になること
dt.temp[ , (cm) := lapply(.SD, `*`, foodAvailRatio), .SDcols = cm] 

注意。

1.9.6(現時点ではCRAN)では、foodAvailRatiodt.temp$foodAvailRatioに置き換えることができます。

関連する問題