首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回收和分配函数(``split<-`)

回收和分配函数(``split<-`)
EN

Stack Overflow用户
提问于 2013-01-12 22:03:55
回答 2查看 406关注 0票数 16

有人能给我解释一下这一行R代码是怎么工作的吗?

代码语言:javascript
复制
split(dat, f) <- lapply(split(dat, f), max)

我认为这只是一个回收规则,但实际上我不能理解它。

数据示例:

代码语言:javascript
复制
dat <- c(1, 2, 3, 100, 200, 300)
f <- as.factor(c("a", "a", "b", "a", "b", "b"))
split(dat, f) <- lapply(split(dat, f), max)
dat
[1] 100 100 300 100 300 300

代码做了我想做的事情(按组分配最大值),但问题是这是如何完成的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 22:15:21

拆分得到矢量中的值dat[c(1,2,4)]dat[c(3,5,6)]

赋值等同于dat[c(1,2,4)] <- 100 ; dat[c(3,5,6)] <- 300,这就是回收发生的地方。

编辑的

至于发生了什么,以及为什么会产生向量赋值,请参阅语言定义手册(http://cran.r-project.org/doc/manuals/R-lang.pdf)的第21页。呼叫声:

代码语言:javascript
复制
split(def, f) <- Z

被解释为:

代码语言:javascript
复制
‘*tmp*‘ <- def
def <- "split<-"(‘*tmp*‘, f, value=Z)
rm(‘*tmp*‘)

请注意,split<-.default返回修改后的向量。

票数 9
EN

Stack Overflow用户

发布于 2013-01-12 22:16:03

多亏了这条评论,答案在split<-.default

为了解释它的行为,我在这里调用了split<-.default,其中包含了我在问题中调用的结果

代码语言:javascript
复制
`split<-.default` <- function(dat, f,value = lapply(split(dat, f), max))
{
    ix <- split(seq_along(dat), f, drop = drop, ...)  ## the call of split here!!
    n <- length(value)
    j <- 0
    for (i in ix) {
        j <- j %% n + 1
        x[i] <- value[[j]]  ## here we assign the result of the first split
    }
    x
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14294052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档