在使用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])
答案 0 :(得分:8)
你仍然可以访问组变量,但它就像一个普通的向量,每个组都有一个唯一的值,所以如果你把unique
放在它周围,它就会起作用。同时,dplyr
似乎无法自动展开data.table
之类的行,您需要unnest
tidyr
包中的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
:
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
加速,因为我们已经知道每个组的组变量向量都是相同的:
<asp:ListBox ID="ListBox1" runat="server">
<asp:ListItem Value="100">A</asp:ListItem>
<asp:ListItem Value="100">B</asp:ListItem>
</asp:ListBox>
答案 1 :(得分:7)
我们可以使用do
中的dplyr
。 (没有使用其他包)。 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
或者代替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
这也可以在不使用任何包的情况下完成
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