我喜欢 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
但我一直在想“必须有更好的方法”
谢谢!