R访问data.table的列

时间:2018-06-08 09:27:00

标签: r data.table

我有一个大的data.table df,由0到1之间的整数值组成,我想改变一些列。这些名称如下所示。我想这10个缩放因子,也是整数,所以我认为循环会更有效。我使用了包data.table

Cur_1 Cur_2 Cur_3 Cur_4 Cur_5 Cur_6 Cur_7 Cur_8 Cur_9 Cur_10 Cur_11 Cur_12

0.225 0.227 0.229 0.233 0.225 0.226 0.228 0.229 0.229 0.301 0.302 0.305

0.226 0.227 0.229 0.233 0.225 0.226 0.228 0.229 0.229 0.301 0.302 0.305

if(pd_scaling1!=0){
df$Cur_1=df$Cur_1*(1+scaling1)
df$Cur_2=df$Cur_2*(1+scaling1)
df$Cur_3=df$Cur_3*(1+scaling1)
df$Cur_4=df$Cur_4*(1+scaling1)
df$Cur_5=df$Cur_5*(1+scaling1)
df$Cur_6=df$Cur_6*(1+scaling1)
df$Cur_7=df$Cur_7*(1+scaling1)
df$Cur_8=df$Cur_8*(1+scaling1)
df$Cur_9=df$Cur_9*(1+scaling1)
df$Cur_10=df$Cur_10*(1+scaling1)
df$Cur_11=df$Cur_11*(1+scaling1)
df$Cur_12=df$Cur_12*(1+scaling1)
}

我试过了:

for(i in 1:10){
  if(get(paste("scaling",i,sep=""))!=0){
    for(j in (i-1)*12+1:i*12){
         df[,get(paste("Cur",j,sep="_")):=get(paste("Cur",j,sep="_"))*rep((1+get(paste("scaling",i,sep=""))),h_i)
    }
  }

但是出现了以下错误:

  

get中的错误(粘贴(" Cur",j,sep =" _")):object' Cur_2'未找到       }

1 个答案:

答案 0 :(得分:0)

这是我首先想到的(也许不是最佳解决方案)将比例值应用于给定条件的data.table中的列。

首先,我根据您的数据创建了data.table

library(data.table)
names <- sapply(1:12,function(x) paste0("Cur_",x))
d1 <- c(0.225, 0.227, 0.229, 0.233, 0.225, 0.226, 0.228, 0.229, 0.229, 0.301, 0.302, 0.305)
d2 <- c(0.226, 0.227, 0.229, 0.233, 0.225, 0.226, 0.228, 0.229, 0.229, 0.301, 0.302, 0.305)
D <- sapply(1:12, function(x) list(d1[x], d2[x]))
DD <- data.table(D)
colnames(DD) <- names
head(DD)

data.table看起来像这样:

   Cur_1 Cur_2 Cur_3 Cur_4 Cur_5 Cur_6 Cur_7 Cur_8 Cur_9 Cur_10 Cur_11 Cur_12
1: 0.225 0.227 0.229 0.233 0.225 0.226 0.228 0.229 0.229  0.301  0.302  0.305
2: 0.226 0.227 0.229 0.233 0.225 0.226 0.228 0.229 0.229  0.301  0.302  0.305

我想您正在尝试将比例值应用于所有列,因此我创建了一个缩放变量,其中data.table的列长度与随机数相同。

scaling <- rep(100,length(names))

我看到你正在尝试验证比例值是否与0不同,所以我故意将其中一个比例值设为0,只是为了显示我所做解决方案的行为。

scaling[2] <- 0

现在我们创建一个循环来验证缩放的值,并将缩放应用于data.table

的列
for (i in 1:length(names)) {
    if (scaling[i] != 0) {
        DD[,names[i] := lapply(.SD, function(x) unlist(x)*scaling[i]), .SDcols = names[i]]
    }
}

最终的data.table如下所示:

head(DD)
 Cur_1 Cur_2 Cur_3 Cur_4 Cur_5 Cur_6 Cur_7 Cur_8 Cur_9 Cur_10 Cur_11 Cur_12
1:  22.5 0.227  22.9  23.3  22.5  22.6  22.8  22.9  22.9   30.1   30.2   30.5
2:  22.6 0.227  22.9  23.3  22.5  22.6  22.8  22.9  22.9   30.1   30.2   30.5

一些提示:我强烈建议您阅读 David Arenburg提供的来源,因为我不得不猜测您想要的是什么。 评论中 Roland 的来源非常有用,可以很好地解释您的问题。