gpt4 book ai didi

r - data.table 一次计算多列

转载 作者:行者123 更新时间:2023-12-04 08:07:23 25 4
gpt4 key购买 nike

预先感谢您阅读本文。我有一个在 data.table 1.9.3 上运行良好的函数。但是今天我更新了我的 data.table 包,我的功能不起作用。

这是我在 data.table 1.9.3 上的功能和工作示例:

trait.by <- function(data,traits="",cross.by){
traits = intersect(traits,names(data))
if(length(traits)<1){
#if there is no intersect between names and traits
return( data[, list(N. = .N), by=cross.by])
}else{
return(data[,c( N. = .N,
MEAN = lapply(.SD,function(x){return(round(mean(x,na.rm=T),digits=1))}) ,
SD = lapply(.SD,function(x){return(round(sd (x,na.rm=T),digits=2))}) ,
'NA' = lapply(.SD,function(x){return(sum (is.na(x)))})),
by=cross.by, .SDcols = traits])
}
}

> trait.by(data.table(iris),traits = c("Sepal.Length", "Sepal.Width"),cross.by="Species")
# Species N. MEAN.Sepal.Length MEAN.Sepal.Width SD.Sepal.Length
#1: setosa 50 5.0 3.4 0.35
#2: versicolor 50 5.9 2.8 0.52
#3: virginica 50 6.6 3.0 0.64
# SD.Sepal.Width NA.Sepal.Length NA.Sepal.Width
#1: 0.38 0 0
#2: 0.31 0 0
#3: 0.32 0 0

重点是 MEAN.(traits) , SD.(traits)NA.(traits)为我在 traits 中给出的所有列计算多变的。

当我使用 data.table 1.9.4 运行它时,我收到以下错误:
> trait.by(data.table(iris),traits = c("Sepal.Length",    "Sepal.Width"),cross.by="Species")
#Error in assign("..FUN", eval(fun, SDenv, SDenv), SDenv) :
# cannot change value of locked binding for '..FUN'

知道我应该如何解决这个问题吗?!

最佳答案

更新:现已在 1.9.5 中修复此问题在 commit 1680 .来自 NEWS :

  1. Fixed a bug in the internal optimisation of j-expression with more than one lapply(.SD, function(..) ..) as illustrated here on SO. Closes #985. Thanks to @jadaliha for the report and to @BrodieG for the debugging on SO.


现在这可以按预期工作:
data[,
c(
MEAN = lapply(.SD,function(x){return(round(mean(x,na.rm=T),digits=1))}),
SD = lapply(.SD,function(x){return(round(sd (x,na.rm=T),digits=2))})
), by=cross.by, .SDcols = traits]

这看起来像是一个由于多次使用 lapply(.SD, FUN) 而出现的错误。合二为一 data.table结合 c( 调用.您可以通过替换 c( 来解决它与 .( .
traits <- c("Sepal.Length",    "Sepal.Width")
cross.by <- "Species"
data <- data.table(iris)

data[,
c(
MEAN = lapply(.SD,function(x){return(round(mean(x,na.rm=T),digits=1))})
),
by=cross.by, .SDcols = traits
]

作品。
data[,
c(
SD = lapply(.SD,function(x){return(round(sd (x,na.rm=T),digits=2))})
),
by=cross.by, .SDcols = traits
]

作品。
data[,
c(
MEAN = lapply(.SD,function(x){return(round(mean(x,na.rm=T),digits=1))}),
SD = lapply(.SD,function(x){return(round(sd (x,na.rm=T),digits=2))})
),
by=cross.by, .SDcols = traits
]

不工作
data[,
.(
MEAN = lapply(.SD,function(x){return(round(mean(x,na.rm=T),digits=1))}),
SD = lapply(.SD,function(x){return(round(sd (x,na.rm=T),digits=2))})
),
by=cross.by, .SDcols = traits
]

作品。

关于r - data.table 一次计算多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27494813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com