如何使用do()从plyr复制结果

Jon*_*ton 1 r plyr dplyr

这是一段代码plyr.我通过分组变量A分割数据帧dta,然后将用户定义的函数fn应用于每个部分:

require(plyr)

dta <- data.frame(
  A=rep(LETTERS[1:7], each=1000),
  B=runif(7000)
  )

fn <- function(x){
  y <- x
  multiplier <- ifelse(
    x$A[1] %in% c("A", "D", "E"),
    3, 2
  )
  to_multiply <- y$B > 0.3
  y$B[to_multiply] <- y$B[to_multiply] *multiplier
  return(y)
}

dta_der <- ddply(dta, .(A), fn)
Run Code Online (Sandbox Code Playgroud)

这符合我的预期.(注意,功能本身并不重要.这只是一个例子.)

现在这就是我所期望的将会产生相同的结果 dplyr

require(dplyr)

dta <- data.frame(
  A=rep(LETTERS[1:7], each=1000), 
  B=runif(7000)
)

fn <- function(x){
  y <- x
  multiplier <- ifelse(
    x$A[1] %in% c("A", "D", "E"),
    3, 2
  )
  to_multiply <- y$B > 0.3
  y$B[to_multiply] <- y$B[to_multiply] *multiplier
  return(y)
}


dta %>%
  group_by(A) %>%
  do(fn)
Run Code Online (Sandbox Code Playgroud)

但是,它产生的Error: Results are not data frames at positions: 1, 2, 3, 4, 5, 6, 7不是预期的结果.

更糟糕的是,plyr我可以做类似以下的事情fn()

fn2 <- function(x){
    browser()
    out <- NULL
}
Run Code Online (Sandbox Code Playgroud)

这对于能够看到传递给每个"片段"的内容非常有用,fn以确保它具有预期的内容和结构,并相应地帮助开发该功能.使用dplyr此骨架结构会在一开始就产生错误.

如果,而不是使用do,我将分组的tbl_df对象直接传递给fn,不会产生错误,但在传递给fn之前,这些片段不会分开.也就是说,如果我dim(x)browser()停止fn2时输入,我会1000 2进入plyr示例,并7000 2dplyr示例中.

有没有什么方法dplyr可以像我一直使用的那样用于用户定义的函数plyr?谢谢,乔恩

jal*_*pic 5

我觉得这很有效......

你应该检查结果是否符合要求......

dta %>% 
  group_by(A) %>%
  do(fn(.))

#   A          B
#1  A 0.22276975
#2  A 0.01183619
#3  A 1.84315247
#4  A 0.19809142
#5  A 0.08114770
#6  A 1.48606944
#7  A 0.84864389
#8  A 0.60060566
#9  A 0.25362720
#10 A 1.68528202
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你不想使用do你可以使用%$%管道操作员magrittr

dta %>% 
  group_by(A) %$%
  fn(.)
Run Code Online (Sandbox Code Playgroud)