2017-02-26 93 views
1

我想动态创建列名称(或向量)(vlist)动态创建列表的常量(denList)。因此列列表第一列中的每个元素都被常量列表中的第一个常量等分。下面的代码设置一个包含两列的数据表,并用常量创建两个变量。最后一条是我尝试分割但失败。帮助解决看起来应该是一个简单的问题,不胜感激。用列表(或常量向量)划分列表(或向量)

library(data.table) 
DT <- data.table(v1 = runif(10), v2 = runif(10)) 
v1Den <- 10 
v2Den <- 20 
denList <- as.vector(c("v1Den", "v2Den")) 
vlist <- as.vector(c("v1", "v2")) 
ratioList <- as.vector(c("V1rat", "V2rat")) 

DT[,(ratioList) := Map(`/`, mget(vlist), mget(denList))] 

回答

1

我们可以指定envir为 'denList' 作为.GlobalEnv

DT[,(ratioList) := Map(`/`, mget(vlist), mget(denList, envir = .GlobalEnv))] 
DT 
#   v1   v2  V1rat  V2rat 
#1: 0.7259460 0.12956933 0.07259460 0.006478467 
#2: 0.8867084 0.07180409 0.08867084 0.003590204 
#3: 0.3466163 0.46579134 0.03466163 0.023289567 
#4: 0.2764356 0.02441249 0.02764356 0.001220625 
#5: 0.7028396 0.71207397 0.07028396 0.035603699 
#6: 0.9035681 0.51862505 0.09035681 0.025931252 
#7: 0.1842809 0.78817567 0.01842809 0.039408784 
#8: 0.1215719 0.95116182 0.01215719 0.047558091 
#9: 0.8056753 0.39964896 0.08056753 0.019982448 
#10:0.2990145 0.87846840 0.02990145 0.043923420 

或者另一种选择是set

for(j in seq_along(vlist)){ 
set(DT, i = NULL, j = ratioList[j], value = DT[[vlist[j]]]/get(denList[j])) 
} 
+1

固定在原岗位的错别字。 – JerryN