1

キーを構成する一連の列と、その他の多数の数値列を含むデータ テーブルがあります。各列と同じ長さの別のベクトルがあり、各列を他のベクトルと元の列の積に置き換えたいと思います。これを効率的に行う方法を見つけるのに苦労しています。これを列ごとに実行できます--

data <- data.table(id1=c("a","a","b","b"), id2=c("c","d","c","d"), var1=1:4, var2=5:8,   var3=9:12)
setkeyv(data, c("id1", "id2"))
x <- c(10, 100, 1000, 10000)
data$var1 <- data[,var1 * x] 
data

--しかし、最終的にはこれらの変数を何百も持つことになります。また、列の数自体が可変であるため、列を名前で呼び出さなくても何らかの方法で列をループできると便利です。これは有望に思えました:

data <- data[,lapply(list(var2, var3), function(y) y*x)]
data

しかし、これを行うと、キーとして使用される列が削除されます。これは保持したいので、すべての変数名をリストする必要があります。私が探しているものに相当するデータフレームは次のようなものです:

data <- data.frame(id1=c("a","a","b","b"), id2=c("c","d","c","d"), var1=1:4, var2=5:8, var3=9:12)
for (var in grep("var", names(data))) data[,var] <- x*data[,var]
data
4

1 に答える 1

4

1)これを試してください:

> data[ , .SD * x[.I], by = list( id1, id2 ) ]
   id1 id2  var1  var2   var3
1:   a   c    10    50     90
2:   a   d   200   600   1000
3:   b   c  3000  7000  11000
4:   b   d 40000 80000 120000

2) またはこの by-without-by バリエーション:

> setkey(data, id1, id2 )
> data[ J( id1, id2 ), .SD * x[.I] ]
   id1 id2  var1  var2   var3
1:   a   c    10    50     90
2:   a   d   200   600   1000
3:   b   c  3000  7000  11000
4:   b   d 40000 80000 120000

3) またはこれ:

> data[, cbind( id1, id2, .SD[, !c("id1", "id2")] * x )]
  id1 id2  var1  var2   var3
1   a   c    10    50     90
2   a   d   200   600   1000
3   b   c  3000  7000  11000
4   b   d 40000 80000 120000
于 2013-05-21T00:14:14.333 に答える