我有一个data.frame看起来像这样的.
x a 1
x b 2
x c 3
y a 3
y b 3
y c 2
Run Code Online (Sandbox Code Playgroud)
我想以矩阵形式这样做,所以我可以将它送到热图以制作情节.结果应该类似于:
a b c
x 1 2 3
y 3 3 2
Run Code Online (Sandbox Code Playgroud)
我已尝试cast从reshape包中尝试编写手动函数来执行此操作,但我似乎无法正确执行此操作.
在使用plyrI 时,我经常发现使用adply标量函数很有用,我必须将其应用于每一行.
例如
data(iris)
library(plyr)
head(
adply(iris, 1, transform , Max.Len= max(Sepal.Length,Petal.Length))
)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len
1 5.1 3.5 1.4 0.2 setosa 5.1
2 4.9 3.0 1.4 0.2 setosa 4.9
3 4.7 3.2 1.3 0.2 setosa 4.7
4 4.6 3.1 1.5 0.2 setosa 4.6
5 5.0 3.6 1.4 0.2 setosa 5.0
6 5.4 3.9 1.7 0.4 setosa 5.4
Run Code Online (Sandbox Code Playgroud)
现在我正在使用dplyr更多,我想知道是否有一个整洁/自然的方式来做到这一点?因为这不是我想要的:
library(dplyr)
head(
mutate(iris, Max.Len= max(Sepal.Length,Petal.Length))
)
Sepal.Length Sepal.Width Petal.Length Petal.Width …Run Code Online (Sandbox Code Playgroud) 我想用dplyr在每个组中选择一个具有最大值的行.
首先,我生成一些随机数据来显示我的问题
set.seed(1)
df <- expand.grid(list(A = 1:5, B = 1:5, C = 1:5))
df$value <- runif(nrow(df))
Run Code Online (Sandbox Code Playgroud)
在plyr中,我可以使用自定义函数来选择此行.
library(plyr)
ddply(df, .(A, B), function(x) x[which.max(x$value),])
Run Code Online (Sandbox Code Playgroud)
在dplyr中,我使用此代码来获取最大值,但不是具有最大值的行(在本例中为C列).
library(dplyr)
df %>% group_by(A, B) %>%
summarise(max = max(value))
Run Code Online (Sandbox Code Playgroud)
我怎么能实现这个目标?谢谢你的任何建议.
sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
[5] LC_TIME=English_Australia.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.2 plyr_1.8.1
loaded via a namespace (and not attached):
[1] assertthat_0.1.0.99 parallel_3.1.0 Rcpp_0.11.1 …Run Code Online (Sandbox Code Playgroud) 我试图重现dplyr包中的一个示例但是此错误消息.我期待看到以每种组合的频率产生的新列n.有人能告诉我我错过了什么吗?我三重检查包装是否已加载.一如既往地感谢您的帮助.
library(dplyr)
# summarise peels off a single layer of grouping
by_vs_am <- group_by(mtcars, vs, am)
by_vs <- summarise(by_vs_am, n = n())
Run Code Online (Sandbox Code Playgroud)
n()出错:不应直接调用此函数
当使用summarise具有plyr的ddply功能,空类别默认情况下删除.您可以通过添加更改此行为.drop = FALSE.然而,当使用这不起作用summarise用dplyr.还有另一种方法可以在结果中保留空类别吗?
这是假数据的一个例子.
library(dplyr)
df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
# Now add an extra level to df$b that has no corresponding value in df$a
df$b = factor(df$b, levels=1:3)
# Summarise with plyr, keeping categories with a count of zero
plyr::ddply(df, "b", summarise, count_a=length(a), .drop=FALSE)
b count_a
1 1 6
2 2 6
3 3 0
# Now try it with dplyr
df %.%
group_by(b) %.%
summarise(count_a=length(a), .drop=FALSE)
b …Run Code Online (Sandbox Code Playgroud) 我经常需要根据不同变量的值更改变量的值,如下所示:
mtcars$mpg[mtcars$cyl == 4] <- NA
Run Code Online (Sandbox Code Playgroud)
我尝试过这样做,dplyr但悲惨地失败了:
mtcars %>%
mutate(mpg = mpg == NA[cyl == 4]) %>%
as.data.frame()
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做dplyr?
我(可能)不是指"所有其他变量",意思就像var1~.这里一样.我plyr再次指出并调查mlply并想知道为什么参数是用这样的前导点定义的:
function (.data, .fun = NULL, ..., .expand = TRUE, .progress = "none",
.parallel = FALSE)
{
if (is.matrix(.data) & !is.list(.data))
.data <- .matrix_to_df(.data)
f <- splat(.fun)
alply(.data = .data, .margins = 1, .fun = f, ..., .expand = .expand,
.progress = .progress, .parallel = .parallel)
}
<environment: namespace:plyr>
Run Code Online (Sandbox Code Playgroud)
有什么用?这只是个人偏好,命名惯例还是更多?通常R是如此功能,以至于我错过了以前很久以前完成的技巧.
我正在使用mtcars数据集.我想找到特定数据组合的记录数.与count(*)SQL中的group by子句非常相似的东西.ddply()来自plyr正在为我工作
library(plyr)
ddply(mtcars, .(cyl,gear),nrow)
Run Code Online (Sandbox Code Playgroud)
有输出
cyl gear V1
1 4 3 1
2 4 4 8
3 4 5 2
4 6 3 2
5 6 4 4
6 6 5 1
7 8 3 12
8 8 5 2
Run Code Online (Sandbox Code Playgroud)
使用此代码
library(dplyr)
g <- group_by(mtcars, cyl, gear)
summarise(g, length(gear))
Run Code Online (Sandbox Code Playgroud)
有输出
length(cyl)
1 32
Run Code Online (Sandbox Code Playgroud)
我找到了传入的各种功能,summarise()但似乎没有一个对我有用.我发现的一个功能是sum(G)返回
Error in eval(expr, envir, enclos) : object 'G' not found
Run Code Online (Sandbox Code Playgroud)
尝试使用n(),返回 …
我想我正在使用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) 我有一个data.table:
set.seed(1)
data <- data.table(time = c(1:3, 1:4),
groups = c(rep(c("b", "a"), c(3, 4))),
value = rnorm(7))
data
# groups time value
# 1: b 1 -0.6264538
# 2: b 2 0.1836433
# 3: b 3 -0.8356286
# 4: a 1 1.5952808
# 5: a 2 0.3295078
# 6: a 3 -0.8204684
# 7: a 4 0.4874291
Run Code Online (Sandbox Code Playgroud)
我想在每个"组"级别内计算"值"列的滞后版本.
结果应该是这样的
# groups time value lag.value
# 1 a 1 1.5952808 NA
# 2 a 2 0.3295078 1.5952808 …Run Code Online (Sandbox Code Playgroud) plyr ×10
r ×10
dplyr ×7
dataframe ×3
data.table ×2
coding-style ×1
function ×1
matrix ×1
reshape ×1
tidyr ×1