data.table - выбрать строки по нескольким групповым столбцам - PullRequest
0 голосов
/ 27 ноября 2018

некоторые данные (взяты из https://www.r -bloggers.com / two-of-my-favourite-data-table-features /

# generate a small dataset
set.seed(1234)
smalldat <- data.frame(group1 = rep(1:2, each = 5), 
                       group2 = rep(c('a','b'), times = 5), 
                       x = rnorm(10))

# convert to data.frame to data.table
library(data.table)
smalldat <- data.table(smalldat)

# convert aggregated variable into raw data file
smalldat[, aggGroup1 := mean(x), by = group1]

# aggregate with 2 variables
smalldat[, aggGroup1.2 := mean(x), by = list(group1, group2)]



Output

##     group1 group2       x aggGroup1 aggGroup1.2
##  1:      1      a -1.2071   -0.3524      0.1022
##  2:      1      b  0.2774   -0.3524     -1.0341
##  3:      1      a  1.0844   -0.3524      0.1022
##  4:      1      b -2.3457   -0.3524     -1.0341
##  5:      1      a  0.4291   -0.3524      0.1022
##  6:      2      b  0.5061   -0.4140     -0.3102
##  7:      2      a -0.5747   -0.4140     -0.5696
##  8:      2      b -0.5466   -0.4140     -0.3102
##  9:      2      a -0.5645   -0.4140     -0.5696
## 10:      2      b -0.8900   -0.4140     -0.3102

Как выбрать строки, гдеaggGroup1.2 имеет значение min для group1, сохраняя информацию group2.

Результат должен выглядеть следующим образом:

group1   group2   aggGroup1.2
1        b        -1.0341
2        a        -0.5696

Я пытался сделатьэто с синтаксисом data.table, но не удалось ...

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

В дополнение к ответу Грегора можно было бы оф.также попробуйте получить весь ряд:

smalldat[smalldat[, .I[which.min(aggGroup1.2)], by = group1][, V1]]

   group1 group2          x  aggGroup1 aggGroup1.2
1:      1      b  0.2774292 -0.3523537   -1.034134
2:      2      a -0.5747400 -0.4139612   -0.569596
0 голосов
/ 27 ноября 2018

Вот один из способов:

smalldat[, .(group2 = group2[which.min(aggGroup1.2)], aggGroup1.2 = min(aggGroup1.2)), by = group1]
#    group1 group2 aggGroup1.2
# 1:      1      b   -1.034134
# 2:      2      a   -0.569596
...