وكذلك الأفراد داخل المجموعات
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)
}
التعليق الأكثر فائدة
الجواب أعلاه من drhagen يبدو أنه قديم. يبدو أن هذا يعمل الآن: