2014-11-25 4 views
3

Когда я Манипуляции с таблицами с помощью 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 C или C B A), но в моем обычном порядке (скажем, A C B)? Должен ли я каким-то образом использовать rank с итоговой таблицей?

ответ

3

Вы можете повторно order после того, как агрегация делается

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

Благодаря Арун для выяснения этого вопроса. У вас есть ошибочные места в вашем столе. Удалите их, а затем вы можете использовать order (см. Выше) или предложение объединения Аруном (см. Ниже).

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 ----- ^^^ 
+1

В качестве альтернативы вы можете присоединиться к следующему: 'DT1 [, средний (colB), keyby = КОЛ]' [(желательно).]. или просто 'dt1 [, mean (colB), keyby = colA] [желательно]' (потому что это столбец с одним символом). – Arun

+1

@Arun - Когда я запускаю это и получаю столбец 'NA' в' V1' –

+3

Это из-за пробелов в его 'dt1 $ colA'. Сделайте 'dt1 [, colA: = gsub (" "," ", colA)]', а затем повторите попытку. – Arun

Смежные вопросы