【问题标题】:R access to columns of a data.tableR访问data.table的列
【发布时间】:2018-06-08 09:27:00
【问题描述】:

我有一个很大的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(paste("Cur", j, sep = "_")) 出错:找不到对象 'Cur_2' }

【问题讨论】:

  • 请查看How to make a great R reproducible example? 并解决您的问题,以便我们为您提供帮助。
  • 请阅读 data.table 小插曲。他们展示了如何正确循环列。
  • @Roland 能给我一个链接吗,我在data.table vignettes找不到它
  • 参见该小插图中的 2.e 和 this one 中的 2.e。
  • @abhiieor 感谢您的提示,但它不起作用

标签: r data.table


【解决方案1】:

这是我想到的第一件事(可能不是最佳解决方案),即在给定条件的情况下将比例值应用于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 提供的源代码,因为我不得不猜测您想要什么。 cmets中Roland的来源非常有用,很好地解释了您的问题的解决方案。

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多