Как эффективно выбрать случайную выборку переменных из набора переменных в кадре данных - PullRequest
0 голосов
/ 19 февраля 2019

Буду признателен за любую помощь в случайном выборе подмножества var.w_X, содержащего 5 из 10 var.w_X переменных, из моих выборочных данных sampleDT, сохраняя при этом все остальные переменные, которые не начинаются с var.w_.

Ниже приведены данные выборки sampleDT, которые среди прочих переменных (которые должны быть сохранены) содержат X переменных, начинающихся с var.w_ в их именах (те, из которых можно извлечь случайную выборку),

В текущем примере X=10, так что var.w_ включает от var.w_1 до var.w_10, и я хочу извлечь случайную выборку из 5 из этих 10.Однако, в моих реальных данных, X>1,000,000, и я мог бы захотеть извлечь выборку из 7,500 var.w_ переменных из этих X>1,000,000.

Следовательно, учет эффективности в любом конкретном решении имеет первостепенное значение, поскольку недавно У меня возникли некоторые проблемы с производительностью mutate_at, причину которых у меня до сих пор нет объяснения.

Важно, что другие переменные, которые нужно сохранить (те, которые не начинаются с var.w_), не гарантированно останутся в каком-либо заранее заданном порядке, так как они могут быть расположены до и / или между и / или послепеременные var.w_, например.Поэтому решения, основанные на порядке столбцов, не будут работать.

# пример данных

sampleDT<-structure(list(n = c(62L, 96L, 17L, 41L, 212L, 143L, 143L, 143L, 
73L, 73L), r = c(3L, 1L, 0L, 2L, 170L, 21L, 0L, 33L, 62L, 17L
), p = c(0.0483870967741935, 0.0104166666666667, 0, 0.0487804878048781, 
0.80188679245283, 0.146853146853147, 0, 0.230769230769231, 0.849315068493151, 
0.232876712328767), var.w_8 = c(1.94254385942857, 1.18801169942857, 
3.16131123942857, 3.16131123942857, 1.13482609242857, 1.13042157942857, 
2.13042157942857, 1.13042157942857, 1.12335579942857, 1.12335579942857
), var.w_9 = c(1.942365288, 1.187833128, 3.161132668, 3.161132668, 
1.134647521, 1.130243008, 2.130243008, 1.130243008, 1.123177228, 
1.123177228), var.w_10 = c(1.94222639911111, 1.18769423911111, 
3.16099377911111, 3.16099377911111, 1.13450863211111, 1.13010411911111, 
2.13010411911111, 1.13010411911111, 1.12303833911111, 1.12303833911111
), group = c(1L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 
0L, 0L), treat = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L), c1 = c(1.941115288, 
1.186583128, 1.159882668, 1.159882668, 1.133397521, 1.128993008, 
1.128993008, 1.128993008, 1.121927228, 1.121927228), var.w_6 = c(1.939115288, 1.184583128, 
3.157882668, 3.157882668, 1.131397521, 1.126993008, 2.126993008, 
1.126993008, 1.119927228, 1.119927228), var.w_7 = c(1.94278195466667, 
1.18824979466667, 3.16154933466667, 3.16154933466667, 1.13506418766667, 
1.13065967466667, 2.13065967466667, 1.13065967466667, 1.12359389466667, 
1.12359389466667), c2 = c(0.1438, 
0.237, 0.2774, 0.2774, 0.2093, 0.1206, 0.1707, 0.0699, 0.1351, 
0.1206), var.w_1 = c(1.941115288, 1.186583128, 3.159882668, 3.159882668, 
1.133397521, 1.128993008, 2.128993008, 1.128993008, 1.121927228, 
1.121927228), var.w_2 = c(1.931115288, 1.176583128, 3.149882668, 
3.149882668, 1.123397521, 1.118993008, 2.118993008, 1.118993008, 
1.111927228, 1.111927228), var.w_3 = c(1.946115288, 1.191583128, 
3.164882668, 3.164882668, 1.138397521, 1.133993008, 2.133993008, 
1.133993008, 1.126927228, 1.126927228), var.w_4 = c(1.93778195466667, 
1.18324979466667, 3.15654933466667, 3.15654933466667, 1.13006418766667, 
1.12565967466667, 2.12565967466667, 1.12565967466667, 1.11859389466667, 
1.11859389466667), var.w_5 = c(1.943615288, 1.189083128, 3.162382668, 
3.162382668, 1.135897521, 1.131493008, 2.131493008, 1.131493008, 
1.124427228, 1.124427228)), class = "data.frame", row.names = c(NA, -10L))

# моя попытка

//based on the comment by @akrun - this does not keep the other variables as specified above

myvars <- sample(grep("var\\.w_", names(sampleDT), value = TRUE), 5)
sampleDT_test <- sampleDT[myvars]

Заранее спасибо за любую помощь

1 Ответ

0 голосов
/ 19 февраля 2019

Извинения, пришлось немного подойти к встрече.Итак, я думаю, вы могли бы адаптировать решение akrun и сохранить первые столбцы для примера кадра данных.Дайте мне знать, как это масштабируется на полном кадре данных.Также спасибо за уточнение.

> # Subsetting the variable names not matching your pattern using grepl
> names(sampleDT)[!grepl("var\\.w_", names(sampleDT))]
[1] "n"     "r"     "p"     "group" "treat" "c1"    "c2"   
> 
> # Combine that with akrun's solution 
> myvars <- c(names(sampleDT)[!grepl("var\\.w_", names(sampleDT))],
+             sample(grep("var\\.w_", names(sampleDT), value = TRUE), 5))
> head(sampleDT[myvars])
    n   r          p group treat       c1     c2  var.w_6  var.w_1  var.w_4  var.w_3  var.w_8
1  62   3 0.04838710     1     0 1.941115 0.1438 1.939115 1.941115 1.937782 1.946115 1.942544
2  96   1 0.01041667     1     0 1.186583 0.2370 1.184583 1.186583 1.183250 1.191583 1.188012
3  17   0 0.00000000     0     0 1.159883 0.2774 3.157883 3.159883 3.156549 3.164883 3.161311
4  41   2 0.04878049     1     0 1.159883 0.2774 3.157883 3.159883 3.156549 3.164883 3.161311
5 212 170 0.80188679     0     0 1.133398 0.2093 1.131398 1.133398 1.130064 1.138398 1.134826
6 143  21 0.14685315     1     1 1.128993 0.1206 1.126993 1.128993 1.125660 1.133993 1.130422

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...