dplyr:访问当前组变量

Fab*_*ing 13 r dplyr data.table

在使用data.table很长一段时间后,我现在认为是时候尝试dplyr了.这很有趣,但我无法弄清楚如何访问 - 当前的分组变量 - 每组返回多个值

以下示例显示与data.table一起正常工作.你会怎么用dplyr写这个

foo <- matrix(c(1, 2, 3, 4), ncol = 2)
dt <- data.table(a = c(1, 1, 2), b = c(4, 5, 6))

# data.table (expected)
dt[, .(c = foo[, a]), by = a]
   a c
1: 1 1
2: 1 2
3: 2 3
4: 2 4

# dplyr (?)
dt %>% 
  group_by(a) %>% 
  summarize(c = foo[a])
Run Code Online (Sandbox Code Playgroud)

Psi*_*dom 8

你仍然可以访问组变量,但它就像一个普通的向量,每个组都有一个唯一的值,所以如果你把unique它放在一边,它就会起作用.而且,同时,dplyr似乎没有像data.table自动扩展行,你将需要unnesttidyr包:

library(dplyr); library(tidyr)
dt %>% 
      group_by(a) %>% 
      summarize(c = list(foo[,unique(a)])) %>% 
      unnest()

# Source: local data frame [4 x 2]

#       a     c
#   <dbl> <dbl>
# 1     1     1
# 2     1     2
# 3     2     3
# 4     2     4
Run Code Online (Sandbox Code Playgroud)

或者我们可以first用来加速,因为我们已经知道组变量向量对于每个组都是相同的:

dt %>% 
      group_by(a) %>% 
      summarize(c = list(foo[,first(a)])) %>% 
      unnest()

# Source: local data frame [4 x 2]

#       a     c
#   <dbl> <dbl>
# 1     1     1
# 2     1     2
# 3     2     3
# 4     2     4
Run Code Online (Sandbox Code Playgroud)


akr*_*run 7

我们可以使用dodplyr.(没有使用其他包).这do对扩展行非常方便.我们只需要包装data.frame.

dt %>% 
     group_by(a) %>%
     do(data.frame(c = foo[, unique(.$a)]))
#      a     c
#  <dbl> <dbl>
#1     1     1
#2     1     2
#3     2     3
#4     2     4
Run Code Online (Sandbox Code Playgroud)

或者代替unique我们可以通过第一次观察进行分组

dt %>% 
    group_by(a) %>%
    do(data.frame(c = foo[, .$a[1]]))
#     a     c
#  <dbl> <dbl>
#1     1     1
#2     1     2
#3     2     3
#4     2     4
Run Code Online (Sandbox Code Playgroud)

这也可以在不使用任何包的情况下完成

stack(lapply(split(dt$a, dt$a), function(x) foo[,unique(x)]))[2:1]
#   ind values
#1   1      1
#2   1      2
#3   2      3
#4   2      4
Run Code Online (Sandbox Code Playgroud)