我喜欢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))

效果很好,给了我我想要的东西。但是,如果事情变得更加复杂,这将导致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))

在我的盒子上,它嚼了几分钟,然后返回:
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 total allocation of 1535Mb: see help(memory.size)

我认为我完全在滥用plyr,并不是说这是plyr的错误,而是我的虐待行为(尽管有肝脏和狗)。

简而言之,是否存在使用ddply代替apply(X, 1, ...)在每一行上进行操作的语法捷径?

我一直在使用的解决方法是创建一个“键”,该键为每一行提供唯一的值,然后我可以重新加入它。
 x <- rnorm(1000)
 y <- rnorm(1000)
 z <- rnorm(1000)
 myLetters <- sample(letters, 1000, replace=T)
 df <- data.frame(x,y, z, myLetters)
  #make the key
 df$myKey <- 1:nrow(df)
 myOut <- merge(df, ddply(df,"myKey" ,function(df) max(df$x,df$y)))
  #knock out the key
 myOut$myKey <- NULL

但我一直认为“必须有更好的方法”

谢谢!

最佳答案

就像对待数组一样对待每一行:

adply(df, 1, transform, max = max(x, y))

关于r - 在R中的数据帧的每一行上执行plyr操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2074606/

10-12 17:36