data.table - Birden fazla grup sütuna göre satırları seçin

oy
0

Bazı veriler (alınan https://www.r-bloggers.com/two-of-my-favorite-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

Nasıl satırları seçmek için aggGroup1.2vardır miniçin değer group1bilgisini tutarak group2.

Sonuç aşağıdaki gibi görünmelidir:

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

Ben data.table sözdizimi ile yapmak çalıştı, ama başarısız oldum ...

Oluştur 27/11/2018 saat 18:17
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

Gregor tarafından cevap ek olarak, bir OFC olabilir. Ayrıca tüm satır getirmesi deneyin:

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
Cevap 27/11/2018 saat 19:38
kaynak kullanıcı

oy
2

İşte bir yolu şudur:

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
Cevap 27/11/2018 saat 18:38
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more