标签: plyr

聚合给定列上的数据框并显示另一列

我在R中有以下形式的数据帧:

> head(data)
  Group Score Info
1     1     1    a
2     1     2    b
3     1     3    c
4     2     4    d
5     2     3    e
6     2     1    f
Run Code Online (Sandbox Code Playgroud)

我想在Score使用该max函数的列之后聚合它

> aggregate(data$Score, list(data$Group), max)

  Group.1         x
1       1         3
2       2         4
Run Code Online (Sandbox Code Playgroud)

但我还想显示与每个组InfoScore列的最大值相关联的列.我不知道该怎么做.我想要的输出是:

  Group.1         x        y
1       1         3        c
2       2         4        d
Run Code Online (Sandbox Code Playgroud)

任何提示?

aggregate r plyr greatest-n-per-group

54
推荐指数
6
解决办法
11万
查看次数

在函数内部使用ddply找不到对象错误

这确实挑战了我调试R代码的能力.

我想ddply()用于将相同的函数应用于按顺序命名的不同列; 例如.a,b,c.为此,我打算重复将列名称作为字符串传递,并使用eval(parse(text=ColName))该函数来引用它.我从另一个答案中抓住了这个技术.

这很有效,直到我放入ddply()另一个功能.以下是示例代码:

# Required packages:
library(plyr)

myFunction <- function(x, y){
    NewColName = "a"
    z = ddply(x, y, summarize,
            Ave = mean(eval(parse(text=NewColName)), na.rm=TRUE)
    )
    return(z)
}

a = c(1,2,3,4)
b = c(0,0,1,1)
c = c(5,6,7,8)
df = data.frame(a,b,c)
sv = c("b")

#This works.
ColName = "a"
ddply(df, sv, summarize,
        Ave = mean(eval(parse(text=ColName)), na.rm=TRUE)
)

#This doesn't work
#Produces error: "Error in parse(text = NewColName) : object 'NewColName' not found"
myFunction(df,sv)

#Output in both …
Run Code Online (Sandbox Code Playgroud)

scope r function plyr

40
推荐指数
4
解决办法
1万
查看次数

将列表转换为向量的更好方法?

我有一个命名值列表:

myList <- list('A'=1, 'B'=2, 'C'=3)
Run Code Online (Sandbox Code Playgroud)

我想要一个具有该值的向量 1:3

我无法弄清楚如何在不定义函数的情况下提取值.有一种我不知道的简单方法吗?

library(plyr)
myvector <- laply(myList, function(x) x)
Run Code Online (Sandbox Code Playgroud)

是否有类似于myList$Values剥离名称并将其作为向量返回的东西?

r list plyr

38
推荐指数
3
解决办法
7万
查看次数

为什么我的dplyr group_by&summary不能正常工作?(与plyr的名字冲突)

我有一个如下所示的数据框:

#df
ID  DRUG FED  AUC0t  Tmax   Cmax
1    1     0   100     5      20
2    1     1   200     6      25
3    0     1   NA      2      30 
4    0     0   150     6      65
Run Code Online (Sandbox Code Playgroud)

答案等等.我想总结药物DRUG和FED状态的AUC,Tmax和Cmax的一些统计数据FED.我用dplyr.例如:对于AUC:

CI90lo <- function(x) quantile(x, probs=0.05, na.rm=TRUE)
CI90hi <- function(x) quantile(x, probs=0.95, na.rm=TRUE)  

summary <- df %>%
             group_by(DRUG,FED) %>%
             summarize(mean=mean(AUC0t, na.rm=TRUE), 
                                 low = CI90lo(AUC0t), 
                                 high= CI90hi(AUC0t),
                                 min=min(AUC0t, na.rm=TRUE),
                                 max=max(AUC0t,na.rm=TRUE), 
                                 sd= sd(AUC0t, na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)

但是,输出不按DRUG和FED分组.它只给出一行包含DRUG和FED中未分面的统计数据.

知道为什么吗?我怎样才能让它做正确的事情?

r shadowing plyr name-collision dplyr

38
推荐指数
3
解决办法
5万
查看次数

ddply错误的含义:'names'属性[9]的长度必须与vector [1]的长度相同

我正在通过黑客机器学习,我被困在这一行:

from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

Error in attributes(out) <- attributes(col) : 
  'names' attribute [9] must be the same length as the vector [1]
Run Code Online (Sandbox Code Playgroud)

这是一个追溯():

> traceback()
11: FUN(1:5[[1L]], ...)
10: lapply(seq_len(n), extract_col_rows, df = x, i = i)
9: extract_rows(x$data, x$index[[i]])
8: `[[.indexed_df`(pieces, i)
7: pieces[[i]]
6: function (i) 
   {
       piece <- pieces[[i]]
       if (.inform) {
           res <- try(.fun(piece, ...))
           if (inherits(res, "try-error")) {
               piece <- paste(capture.output(print(piece)), collapse = "\n")
               stop("with piece ", i, ": …
Run Code Online (Sandbox Code Playgroud)

r plyr

37
推荐指数
2
解决办法
3万
查看次数

R:加快"分组"操作

我有一个模拟,有一个巨大的聚合,并在中间组合步骤.我使用plyr的ddply()函数对这个过程进行了原型设计,这对我的大部分需求非常有用.但是我需要这个聚合步骤更快,因为我必须运行10K模拟.我已经在并行缩放模拟,但如果这一步更快,我可以大大减少我需要的节点数量.

这是对我要做的事情的合理简化:

library(Hmisc)

# Set up some example data
year <-    sample(1970:2008, 1e6, rep=T)
state <-   sample(1:50, 1e6, rep=T)
group1 <-  sample(1:6, 1e6, rep=T)
group2 <-  sample(1:3, 1e6, rep=T)
myFact <-  rnorm(100, 15, 1e6)
weights <- rnorm(1e6)
myDF <- data.frame(year, state, group1, group2, myFact, weights)

# this is the step I want to make faster
system.time(aggregateDF <- ddply(myDF, c("year", "state", "group1", "group2"),
                     function(df) wtd.mean(df$myFact, weights=df$weights)
                                 )
           )
Run Code Online (Sandbox Code Playgroud)

所有提示或建议表示赞赏!

performance r plyr

36
推荐指数
5
解决办法
8099
查看次数

使用多个度量列将数据从长格式转换为宽格式

当我想要携带多个度量变量时,我无法找出将数据从长格式转换为宽格式的最优雅和灵活的方法.

例如,这是一个长格式的简单数据框. ID是主体,TIME是时间可变的,并且X和Y是由测量XY:

> my.df <- data.frame(ID=rep(c("A","B","C"), 5), TIME=rep(1:5, each=3), X=1:15, Y=16:30)
> my.df

   ID TIME  X  Y
1   A    1  1 16
2   B    1  2 17
3   C    1  3 18
4   A    2  4 19
5   B    2  5 20
6   C    2  6 21
7   A    3  7 22
8   B    3  8 23
9   C    3  9 24
10  A    4 10 25
11  B    4 11 26 …
Run Code Online (Sandbox Code Playgroud)

r plyr dataframe

34
推荐指数
5
解决办法
2万
查看次数

在R中的数据帧的每一行上执行plyr操作

我喜欢plyr语法.任何时候我必须使用*apply()命令之一,我最终踢狗并进行为期3天的弯曲.因此,为了我的狗和我的肝脏,在数据帧的每一行上执行ddply操作的简洁语法是什么?

这是一个适用于简单案例的例子:

x <- rnorm(10)
y <- rnorm(10)
df <- data.frame(x,y)
ddply(df,names(df) ,function(df) max(df$x,df$y))
Run Code Online (Sandbox Code Playgroud)

这很好,给了我想要的东西.但是如果事情变得更复杂,这会导致plyr变得时髦(并且不像Bootsy Collins)因为plyr正在咀嚼从所有那些浮点数值中取出"等级"

x <- rnorm(1000)
y <- rnorm(1000)
z <- rnorm(1000)
myLetters <- sample(letters, 1000, replace=T)
df <- data.frame(x,y, z, myLetters)
ddply(df,names(df) ,function(df) max(df$x,df$y))
Run Code Online (Sandbox Code Playgroud)

在我的盒子上咀嚼几分钟,然后返回:

Error: memory exhausted (limit reached?)
In addition: Warning messages:
1: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
  Reached total allocation of 1535Mb: see help(memory.size)
2: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
  Reached …
Run Code Online (Sandbox Code Playgroud)

r plyr

33
推荐指数
1
解决办法
1万
查看次数

为缺少时间步骤添加行的最快方法?

我的数据集中有一列,其中时间段(Time)是从ab开始的整数.有时,任何特定组都可能缺少时间段.我想用这些行填写NA.以下是1(几千个)组的示例数据.

structure(list(Id = c(1, 1, 1, 1), Time = c(1, 2, 4, 5), Value = c(0.568780482159894, 
-0.7207749516298, 1.24258192959273, 0.682123081696789)), .Names = c("Id", 
"Time", "Value"), row.names = c(NA, 4L), class = "data.frame")


  Id Time      Value
1  1    1  0.5687805
2  1    2 -0.7207750
3  1    4  1.2425819
4  1    5  0.6821231
Run Code Online (Sandbox Code Playgroud)

如您所见,时间3缺失.通常一个或多个可能会丢失.我可以自己解决这个问题,但恐怕我不会以最有效的方式做到这一点.我的方法是创建一个函数:

生成时间段从序min(Time)max(Time)

然后做一个setdiff抓取缺失的Time值.

将该向量转换为a data.frame

拉出唯一标识符变量(Id以及上面未列出的其他变量),并将其添加到此data.frame中.

合并两者.

从功能返回.

因此整个过程将按如下方式执行:

   # Split the data into individual data.frames by …
Run Code Online (Sandbox Code Playgroud)

r plyr dataframe data.table

33
推荐指数
4
解决办法
1万
查看次数

基于列值的行总和

我想在一列中对具有相同值的行求和:

> df <- data.frame("1"=c("a","b","a","c","c"), "2"=c(1,5,3,6,2), "3"=c(3,3,4,5,2))
> df
  X1 X2 X3
1  a  1  3
2  b  5  3
3  a  3  4
4  c  6  5
5  c  2  2
Run Code Online (Sandbox Code Playgroud)

对于一列(X2),可以聚合数据以获得具有相同X1值的所有行的总和:

> ddply(df, .(X1), summarise, X2=sum(X2))
  X1 X2
1  a  4
2  b  5
3  c  8
Run Code Online (Sandbox Code Playgroud)

如何为X3和除X1之外的任意数量的其他列执行相同的操作?

这是我想要的结果:

  X1 X2 X3
1  a  4  7
2  b  5  3
3  c  8  7
Run Code Online (Sandbox Code Playgroud)

r plyr

31
推荐指数
4
解决办法
4万
查看次数