gpt4 book ai didi

r - 使用plyr按类别计算最频繁的级别

转载 作者:行者123 更新时间:2023-12-04 23:57:38 28 4
gpt4 key购买 nike

我想使用下面的代码使用plyr按类别计算最常见的因子级别。数据框b显示请求的结果。为什么c$mlevels只有值“数字”?

require(plyr)
set.seed(0)
a <- data.frame(cat=round(runif(100, 1, 3)),
levels=factor(round(runif(100, 1, 10))))
mode <- function(x) names(table(x))[which.max(table(x))]
b <- data.frame(cat=1:3,
mlevels=c(mode(a$levels[a$cat==1]),
mode(a$levels[a$cat==2]),
mode(a$levels[a$cat==3])))
c <- ddply(a, .(cat), summarise,
mlevels=mode(levels))

最佳答案

当您使用 summarise , plyr在检查 base 中的函数之前,似乎“看不到”全局环境中声明的函数:

我们可以使用 Hadley 的方便 pryr 来检查这一点。包裹。您可以通过以下命令安装它:

library(devtools)
install_github("pryr")


require(pryr)
require(plyr)
c <- ddply(a, .(cat), summarise, print(where("mode")))
# <environment: namespace:base>
# <environment: namespace:base>
# <environment: namespace:base>

基本上,它不读/不知道/见 您的 mode功能。有两种选择。第一个是@AnandaMahto 的建议,我也会这样做,并建议您坚持下去。另一种选择是不使用 summarise并使用 function(.) 调用它使 mode您的全局环境中的功能是“可见的”。
c <- ddply(a, .(cat), function(x) mode(x$levels))
# cat V1
# 1 1 6
# 2 2 5
# 3 3 9

为什么这样做?
c <- ddply(a, .(cat), function(x) print(where("mode")))
# <environment: R_GlobalEnv>
# <environment: R_GlobalEnv>
# <environment: R_GlobalEnv>

因为正如您在上面看到的,它读取位于 global environment 中的函数。 .
> mode # your function
# function(x)
# names(table(x))[which.max(table(x))]
> environment(mode) # where it sits
# <environment: R_GlobalEnv>

与:
> base::mode # base's mode function
# function (x)
# {
# some lines of code to compute mode
# }
# <bytecode: 0x7fa2f2bff878>
# <environment: namespace:base>

Here's an awesome wikienvironments来自哈德利,如果您有兴趣进一步阅读/探索。

关于r - 使用plyr按类别计算最频繁的级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15173269/

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