2013-02-23 29 views
7

如果我通过在data.table中使用by关键字进行分组,它总是返回by列作为第一列。有没有一个标志/选项告诉它不要这样做?或者摆脱它的一个聪明的方式?有没有办法不返回'by`列作为data.table分组中的第一列

我特别想组,然后rbindlist我原来的表,所以逸岸的问题也可以说是 - “如何阻止它重新排序的列”

例如:

DT = data.table(I = as.numeric(1:6), N = rnorm(6), L = rep(c("a", "b", "c"), 2)) 
DT[, list(I = mean(I), N = mean(N)), by= L] 
DT 

给出:

> DT[, list(I = mean(I), N = mean(N)), by= L] 
    L I   N 
1: a 2.5 0.4291802 
2: b 3.5 0.6669517 
3: c 4.5 -0.6471886 
> DT 
    I   N L 
1: 1 1.8460998 a 
2: 2 0.7093438 b 
3: 3 -1.7991193 c 
4: 4 -0.9877394 a 
5: 5 0.6245596 b 
6: 6 0.5047421 c 

至于rbindlist请求进入,这将是很好能够做到这一点:

DT = rbindlist(list(DT, DT[, list(I = mean(I), N = mean(N)), by= L])) 

或许

DT = rbindlist(list(DT, DT[, list(I = mean(I), N = mean(N), L), by= L])) 

或类似的东西(两者都没有工作)

+2

(+1)我真的很喜欢列以相同的顺序返回! – Arun 2013-02-23 11:32:03

+3

Carone,@Arun,ok +1现在已添加到[FR#1757](https://r-forge.r-project.org/tracker/?group_id=240&atid=978&func=detail&aid=1757)。 – 2013-02-25 09:10:08

+1

@MatthewDowle,感谢您将此功能添加到待办事项列表。 – Arun 2013-02-25 11:22:58

回答

4

我并不特别喜欢这个自动列重新排序为好。该“绝招”我通常做的是获得输出后使用setcolorder如下:

DT <- data.table(I = 1:6, N = rnorm(6), L = rep(c("a", "b", "c"), 2)) 
DT.out <- DT[, list(I = mean(I), N = mean(N)), by= L] 

这里,setcolorder为:

setcolorder(DT.out, names(DT)) 

#  I   N L 
# 1: 2.5 0.772719306 a 
# 2: 3.5 -0.008921738 b 
# 3: 4.5 -0.770807996 c 

当然这个工程如果DT的名字是相同的DT.out。否则,你就必须显式指定列的顺序为:

setcolorder(DT.out, c("I", "N", "L")) 

编辑:既然你想通过行立即约束他们,是的,这将是很好没有这个作为中间结果。并且因为rbindlist似乎按位置绑定,所以可以使用rbind,它按列名绑定,并且data.table将此作为警告,并建议使用use.names=F,如果您想要按位置绑定。您可以放心地忽略此警告。

dt1 <- data.table(x=1:5, y=6:10) 
dt2 <- data.table(y=1:5, x=6:10) 

rbind(dt1, dt2) # or do.call(rbind, list(dt1, dt2)) 

#  x y 
# 1: 1 6 
# 2: 2 7 
# 3: 3 8 
# 4: 4 9 
# 5: 5 10 
# 6: 6 1 
# 7: 7 2 
# 8: 8 3 
# 9: 9 4 
# 10: 10 5 
# Warning message: 
# In .rbind.data.table(...) : 
# Argument 2 has names in a different order. Columns will be bound by name for 
# consistency with base. Alternatively, you can drop names (by using an unnamed 
# list) and the columns will then be joined by position. Or, set use.names=FALSE. 
+0

+1,但是我想到了这一点,但我想立即执行rbind列表,因此不必存储中间值即可对列进行重新排序(我会将其添加到问题中以使其更清晰。 – Corone 2013-02-23 11:02:25

+0

我认为'rbind'自动处理列重新排序吗? – Arun 2013-02-23 11:03:33

+0

看起来像'rbindlist'将列名放置到位置绑定,这与'data.frames'上的'rbind'不同,如果相同的列名以不同的顺序存在,合适地合并。 – Arun 2013-02-23 11:07:04

相关问题