не возвращать автоматически по столбцам с data.table - PullRequest
0 голосов
/ 08 мая 2018

Пример данных:

dt = data.table(a=c(10,20,30,40),b=c(40,30,20,10),c=c(0,0,1,1))
rank_a = dt[,rank(a)]
rank_a

[1] 1 2 3 4

Это возвращает то, что я хочу. Однако, если я добавлю оператор by,

rank_a = dt[,rank(a),by=c]

... затем он возвращает весь фрейм данных, включая столбец "c", а не только ответы, которые я хочу.

Как исправить это поведение?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Универсальным решением для удаления одного или нескольких столбцов "по" может быть использование mget + цепочки:

dt = data.table(a=c(10,20,30,40),b=c(40,30,20,10),c=c(0,0,1,1),d=c(0,0,0,1))
dt
#     a  b c d
# 1: 10 40 0 0
# 2: 20 30 0 0
# 3: 30 20 1 0
# 4: 40 10 1 1

by.cols = c("c", "d")

# group by one or multiple columns without returning the "group by" columns
# (includes code of @Frank now, see comment)
dt[, .(rank=rank(a)),by = by.cols] [, -(1:length(by.cols))]
#    rank
# 1:    1
# 2:    2
# 3:    1
# 4:    1
#
# OLD code (before including the code snippets from @Frank)
# dt[, .(rank = rank(a)),by=mget(by.cols)] [, -(1:length(by.cols))]

Не красиво, но работает.

PS: есть ли лучший способ исключить столбцы из data.table, чьи имена хранятся в символьном векторе?

0 голосов
/ 08 мая 2018

Возвращает другие столбцы, потому что они необходимы для понимания вывода. Например, если у вас есть набор данных:

a    b
1    1
1    2
2    3
2    4

.. и вы запускаете:

dt[, sum(b), a]

Вывод будет выглядеть так:

V1    a
3     1
7     2

Это имеет смысл, поскольку без столбца «a» вывод не будет иметь никакого смысла, так как вы не будете знать, какие значения V1 соответствуют каким группировкам «a». Если вы действительно хотите избавиться от столбцов после такой операции, вы можете просто взять результат с чем-то вроде
dt[, sum(b), a][, V1]

или как таблица данных с

dt[, sum(b), a][, .(V1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...