我有一个数据表,其中包含一系列构成键的列,然后是大量其他数字列。我有一个单独的向量,与每列的长度相同,我想用另一个向量和原始列的乘积替换每列。我无法找到有效地做到这一点的方法。我可以按列进行此列 -
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
答案 0 :(得分: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)或者这个无需变化:
> 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"), with = FALSE] * 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