2016-07-29 24 views
10

在使用data.table很長一段時間後,我現在認爲是時候試試dplyr了。這很有趣,但我無法弄清楚如何訪問 - 當前分組變量 - 返回每個組的多個值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]) 
+2

隨着'summarize'也做,你可能無法做到,你可以嘗試'do' – akrun

+2

你在'foo [a]'中缺少一個逗號......無論如何,正如akrun所建議的,總結並不是一個好的選擇,因爲它喜歡每組返回一行。也不是變異,它喜歡返回n()又名.N,所以你需要在dplyr世界中一起破解一些東西。 – Frank

+0

hm。謝謝。仍然沒有成功:dt%>% group_by(a)%>% do(c = foo [,a]) 您能告訴我工作片段嗎? –

回答

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 

或代替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 
7

您仍然可以訪問該組變量,但它是像每個組一個唯一值的法向量,所以如果你把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 

或者我們可以使用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