相关疑难解决方法(0)

为什么plyr这么慢?

我想我正在使用plyr错误.有人可以告诉我这是否是"高效"的plyr代码?

require(plyr)
plyr <- function(dd) ddply(dd, .(price), summarise, ss=sum(volume)) 
Run Code Online (Sandbox Code Playgroud)

一点背景:我有一些大的聚合问题,我注意到他们每个人都花了一些时间.在尝试解决问题时,我开始对R中各种聚合过程的性能感兴趣.

我测试了一些聚合方法 - 并且发现自己整天都在等待.

当我最终得到结果时,我发现了plyr方法和其他方法之间的巨大差距 - 这让我觉得我做错了.

我运行了以下代码(我以为我在查看时会查看新的数据帧包):

require(plyr)
require(data.table)
require(dataframe)
require(rbenchmark)
require(xts)

plyr <- function(dd) ddply(dd, .(price), summarise, ss=sum(volume)) 
t.apply <- function(dd) unlist(tapply(dd$volume, dd$price, sum))
t.apply.x <- function(dd) unlist(tapply(dd[,2], dd[,1], sum))
l.apply <- function(dd) unlist(lapply(split(dd$volume, dd$price), sum))
l.apply.x <- function(dd) unlist(lapply(split(dd[,2], dd[,1]), sum))
b.y <- function(dd) unlist(by(dd$volume, dd$price, sum))
b.y.x <- function(dd) unlist(by(dd[,2], dd[,1], sum))
agg <- function(dd) aggregate(dd$volume, list(dd$price), sum)
agg.x <- function(dd) aggregate(dd[,2], list(dd[,1]), sum)
dtd <- function(dd) …
Run Code Online (Sandbox Code Playgroud)

r plyr dataframe data.table

58
推荐指数
1
解决办法
5773
查看次数

数据框中的条件计算

我经常需要根据因子变量的条件从数据框中的现有变量计算新变量.

编辑在2分钟内获得4个答案,我意识到我已经过度简化了我的例子.请看下面.

简单的例子:

df <- data.frame(value=c(1:5),class=letters[1:5])
df
value class
1     a
2     b
3     c
4     d
5     e
Run Code Online (Sandbox Code Playgroud)

我可以使用这样的代码

df %>% 
    mutate(result=NA) %>%
    mutate(result=ifelse(class=="a",value*1,result)) %>%
    mutate(result=ifelse(class=="b",value*2,result)) %>%
    mutate(result=ifelse(class=="c",value*3,result)) %>%
    mutate(result=ifelse(class=="d",value*4,result)) %>%
    mutate(result=ifelse(class=="e",value*5,result))
Run Code Online (Sandbox Code Playgroud)

对我的变量执行条件计算,得到

value class result
 1     a      1
 2     b      4
 3     c      9
 4     d     16
 5     e     25
Run Code Online (Sandbox Code Playgroud)

实际上,类的数量更大,计算更复杂,但是,我更喜欢更清洁的东西,就像这样

df %>%
mutate(results=switch(levels(class),
                    "a"=value*1,
                    "b"=value*2,
                    "c"=value*3,
                    "d"=value*4,
                    "e"=value*5))
Run Code Online (Sandbox Code Playgroud)

这显然不起作用

Error in switch(levels(1:5), a = 1:5 * 1, b = 1:5 * 2, c = 1:5 * …
Run Code Online (Sandbox Code Playgroud)

r dplyr

6
推荐指数
1
解决办法
4206
查看次数

标签 统计

r ×2

data.table ×1

dataframe ×1

dplyr ×1

plyr ×1