在 R 中:快速设置 data.table 中的新值
in R: Setting new Values in a data.table fast
我正在尝试以一种有效的方式将值设置为 data.table。下面的代码可以满足我的要求,但对于大型数据集来说太慢了:
DTcars<-as.data.table(mtcars)
for(i in 1:(dim(DTcars)[1]-1)){
for(j in 1:dim(DTcars)[2]){
if(DTcars[i,j, with=F]>10){
set(DTcars,
i=as.integer(i),
j =as.integer(j) ,
value = DTcars[dim(DTcars)[1],j,with=F])
}
}
}
我想要这样的东西...这完全是一个错误的代码,但表达了我的需要,我认为它会更快。这意味着我想对我的 data.table 进行子集化并为特定列插入相同的值并为每一列重复。
DTcars<-as.data.table(mtcars)
ns<-names(DTcars)
for(j in 1:length(ns)){
DTcars[ns[j]>10]<-DTcars[20,ns[j]]
}
我想你在找
for (j in names(DTcars)) set(DTcars,
i = which(DTcars[[j]]>10),
j = j,
value = tail(DTcars[[j]],1)
)
列号或名称可以用作此处的for
迭代器。
value
在 OP 中的两段代码之间发生了变化,所以我不确定。
IMO set
应该谨慎使用,常规 :=
几乎总是足够的:
for (col in names(DTcars))
DTcars[get(col) > 10, (col) := get(col)[.N]]
我正在尝试以一种有效的方式将值设置为 data.table。下面的代码可以满足我的要求,但对于大型数据集来说太慢了:
DTcars<-as.data.table(mtcars)
for(i in 1:(dim(DTcars)[1]-1)){
for(j in 1:dim(DTcars)[2]){
if(DTcars[i,j, with=F]>10){
set(DTcars,
i=as.integer(i),
j =as.integer(j) ,
value = DTcars[dim(DTcars)[1],j,with=F])
}
}
}
我想要这样的东西...这完全是一个错误的代码,但表达了我的需要,我认为它会更快。这意味着我想对我的 data.table 进行子集化并为特定列插入相同的值并为每一列重复。
DTcars<-as.data.table(mtcars)
ns<-names(DTcars)
for(j in 1:length(ns)){
DTcars[ns[j]>10]<-DTcars[20,ns[j]]
}
我想你在找
for (j in names(DTcars)) set(DTcars,
i = which(DTcars[[j]]>10),
j = j,
value = tail(DTcars[[j]],1)
)
列号或名称可以用作此处的for
迭代器。
value
在 OP 中的两段代码之间发生了变化,所以我不确定。
IMO set
应该谨慎使用,常规 :=
几乎总是足够的:
for (col in names(DTcars))
DTcars[get(col) > 10, (col) := get(col)[.N]]