Dplyr: يجب أن تكون قادرًا على أخذ عينات من المجموعات

تم إنشاؤها على ٢٨ مارس ٢٠١٤  ·  9تعليقات  ·  مصدر: tidyverse/dplyr

وكذلك الأفراد داخل المجموعات

التعليق الأكثر فائدة

الجواب أعلاه من drhagen يبدو أنه قديم. يبدو أن هذا يعمل الآن:

sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
  # regroup when done
  grps = tbl %>% groups %>% lapply(as.character) %>% unlist
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}

ال 9 كومينتر

species <- iris %.% 
  group_by(Species) %.% 
  summarise(wt = sum(Sepal.Length)) %.%
  sample_n(5, replace = T, weight = wt) %.%
  select(-wt)

inner_join(species, iris)

أتساءل لماذا تم إغلاق هذا؟ يبدو وكأنه ميزة يحتمل أن تكون مفيدة

iris %>%
    group_by(Species) %>%
    sample_n(1)

لاختيار جميع البيانات من الأنواع العشوائية ، على سبيل المثال

لا أعتقد أن سلوك sample_n يجب أن يتغير للمجموعات لأن أخذ العينات داخل المجموعات هو سلوك حدسي. ومع ذلك ، غالبًا ما يكون من السهل أن تكون قادرًا على أخذ عينات من المجموعات ككل. يجب أن تكون هذه وظيفة ثانية. هذا هو تطبيقي:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
   # regroup when done
   grps = tbl %>% groups %>% unlist %>% as.character
   # check length of groups non-zero
   keep = tbl %>% summarise() %>% sample_n(size, replace, weight)
   # keep only selected groups, regroup because joins change count.
   # regrouping may be unnecessary but joins do something funky to grouping variable
   tbl %>% semi_join(keep) %>% group_by_(grps) 
}

تم توقع مثال

iris %>% group_by(Species) %>% sample_n_groups(1)

+1

تحرير: التغيير إلى dplyr كسر هذا الحل ؛


بالنسبة لأولئك منكم الذين وصلوا إلى هنا عبر محرك البحث بحثًا عن هذه الوظيفة ، فإن التنفيذ بواسطة MarcusWalz لا replace = TRUE . يحتاج التطبيق إلى استخدام right_join (أو left_join أو inner_join ) للاحتفاظ بالتكرارات:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
  # regroup when done
  grps = tbl %>% groups %>% unlist %>% as.character
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(grps) 
}

الكتلة التمهيدية هي حالة استخدام واسعة لهذه الميزة.

drhagen ، في التطبيق الخاص بك ، هل لديك أي اقتراحات حول كيفية إنشاء معرف مجموعة فريد جديد؟

في الواقع ، هذا سهل للغاية:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
  # regroup when done
  grps = tbl %>% groups %>% unlist %>% as.character
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% sample_n(size, replace, weight) %>% 
    mutate(unique_id = 1:NROW(.))
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(grps) 
}

الجواب أعلاه من drhagen يبدو أنه قديم. يبدو أن هذا يعمل الآن:

sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
  # regroup when done
  grps = tbl %>% groups %>% lapply(as.character) %>% unlist
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات