自定义的`by =`

时间:2014-11-25 20:59:21

标签: r data.table

当我使用by=对表进行操作时,生成的表与原始表中的记录顺序相同:

dt1 <- fread(
  "colA,colB
   B,3
   A,1
   C,2
   B,1
   C,2
  ")

 desired <- c('A', 'C', 'B')    

#> dt1[, mean(colB), by=colA]
#   colA V1
#1:    B  2
#2:    A  1
#3:    C  2

但是,如果我不是按原始顺序(B A C此处)而不是通常的sort()顺序(可能是A B CC B A ),但在我的自定义顺序(比如,A C B)?我应该以某种方式在结果表中使用rank吗?

1 个答案:

答案 0 :(得分:3)

聚合完成后你可以重新order

dt1[, mean(colB), by=colA][order(desired),]
#    colA V1
# 1:    A  1
# 2:    C  2
# 3:    B  2

感谢Arun解决了这个问题。你的桌子上有错误的空间。删除它们,然后你可以使用order(上面),或Arun的加入建议(见下文)。

dt1[, colA := gsub(" ", "", colA)]
dt1[, mean(colB), keyby=colA][desired]
#    colA V1
# 1:    A  1
# 2:    C  2
# 3:    B  2

查看原始数据:

dt1 <- fread(
  "colA,colB
   B,3
   A,1
   C,2
   B,1
   C,2
  ")
dput(dt1)
# structure(list(colA = c("   B", "   A", "   C", "   B", "   C"  ...
#        extra space ----- ^^^