2つの列ID
とcategory
。を持つデータフレームがあります。このデータフレームから、各カテゴリから3つのサンプルを取得し、そのサンプルから、合計から6つのサブサンプルを取得しsub_df
て、6つの要素を持つデータフレームを取得します。
library(dplyr)
set.seed(123)
df <- data.frame(ID = 1:100, category = sample(LETTERS[1:10], 100, replace = T))
head(df)
# ID category
# 1 1 C
# 2 2 H
# 3 3 E
# 4 4 I
# 5 5 J
# 6 6 A
sub_df <- df %>% group_by(category) %>% sample_n(3) %>% ungroup() %>% sample_n(6)
sub_df
# # A tibble: 6 x 2
# ID category
# <int> <fct>
# 1 72 G
# 2 88 I
# 3 24 J
# 4 33 G
# 5 86 E
# 6 27 F
sample_n
元のデータフレームからdf
もう一度やりたいと思います。ただし、この時間n
は、sub_df
データフレーム内の各カテゴリの数によって異なります。
sub_df %>% count(category)
# A tibble: 5 x 2
# category n
# <fct> <int>
# 1 E 1
# 2 F 1
# 3 G 2
# 4 I 1
# 5 J 1
に表されていない各グループについてsub_df
、df
上記のように3つをサンプリングしたいと思います。ただし、に含まれているカテゴリについては、結果のデータフレームをと組み合わせた場合に、すべてのカテゴリで合計3つのサンプルを取得するために時間をsub_df
サンプリングしたいと思います。したがって、この例では、E、F、I、Jはすべて2つのサンプルを持ち、Gは1つだけ必要です。3-n
sub_df
各カテゴリをループして、の各カテゴリの数に基づいてサンプルを作成できると思いますsub_df
。ただし、カテゴリの数が非常に多くなると、このループにはかなりの時間がかかる可能性があります。私はこれを行うためのよりきちんとした方法があるかもしれないと思っていました。
結果のカウントは次のようになります。
result_df %>% count(category)
# A tibble: 10 x 2
# category n
# <fct> <int>
# 1 A 3
# 2 B 3
# 3 C 3
# 4 D 3
# 5 E 2
# 6 F 2
# 7 G 1
# 8 H 3
# 9 I 2
# 10 J 2
dplyr
とを使用したソリューションpurrr
。アイデアは、最初df_s2
に各カテゴリの新しいサンプル数を示すデータフレームを作成し、カテゴリごとに分割df
して、との数に関数をdf_list
適用するsample_n
ことです。df_list
df_s2
library(dplyr)
set.seed(123)
df <- data.frame(ID = 1:100, category = sample(LETTERS[1:10], 100, replace = T))
sub_df <- df %>% group_by(category) %>% sample_n(3) %>% ungroup() %>% sample_n(6)
library(purrr)
# Create a table to store the sample number, default to 3
df_s <- data_frame(category = unique(df$category),
Number = 3)
# Minus the count number in sub_df
df_s2 <- df_s %>%
left_join(sub_df %>% count(category), by = "category") %>%
mutate(n = ifelse(is.na(n), 0, n)) %>%
mutate(Number = Number - n) %>%
select(-n) %>%
arrange(category)
# Split the df by category
df_list <- split(df, f = df$category)
# Apply the sample function on df_list based on df_s2
result_df <- map2_dfr(df_list, df_s2$Number, ~sample_n(.x, .y))
# Check the count number of result_df
result_df %>% count(category)
# # A tibble: 10 x 2
# category n
# <fct> <int>
# 1 A 3
# 2 B 3
# 3 C 3
# 4 D 3
# 5 E 2
# 6 F 2
# 7 G 1
# 8 H 3
# 9 I 2
# 10 J 2
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加