如何使用top_n进行条件提取

Posted

技术标签:

【中文标题】如何使用top_n进行条件提取【英文标题】:How to use top_n for conditional extraction 【发布时间】:2021-01-07 11:30:18 【问题描述】:

所以我的 df 中有一个包含“是”或“否”的列(类别),为了创建更平衡的样本,我想选择前 500 个“是”案例的行和我的数据集中的前 500 个“否”案例。

我试过这段代码:

top_n(df,500, category=="Yes")

但这会选择所有是的情况,而不是只选择前 500 个 我也试过这个,但这给了我一个错误,虽然我确信这没有任何意义

df %>% filter(top_n(500, category == "Yes") & top_n(500, category=="No")) 我需要一些正确方向的帮助

【问题讨论】:

【参考方案1】:

我可能只是为此使用head,并直接在数据框上过滤

df1 <- head(df[df$category == "Yes",], 500)
df2 <- head(df[df$category == "No",], 500)

# to combine
out <- rbind(df1, df2)

我猜top_n 做了类似的事情。我希望dplyr 有更好的方法,但这应该可行:)

【讨论】:

这很好用!只是想找到一种方法让 top_n 工作或任何其他 dplyr 方式。将继续搜索:) top_n 不会按照你的想法做。如果您在控制台中搜索 ?top_n,它会按值查找前 500 行。这很重要,因为如果您在数据集中只有一个值,则选择 1 行将与选择 5 具有相同的效果,例如 top_n(data.frame(x=rep(1,10)), 5, "x")top_n(data.frame(x=rep(1,10)), 10, "x") 相同 有一个dplyr 版本的head 称为glimpse 例如***.com/questions/23408510/…【参考方案2】:

如果您想随机选择是/否答案,您可以使用此代码:

#// generate toy data
df <- data.frame(YN = rep(c("yes", "no"),10), val = runif(20, 1, 100))
head(df)
#>    YN      val
#> 1 yes 26.00628
#> 2  no 98.34237
#> 3 yes 68.05788
#> 4  no 21.87011
#> 5 yes 33.92545
#> 6  no 68.74417

#// set random seed for reproducibility
set.seed(123)

#// randomly sample 5 'yes' answers
yes <- df[sample(which(df$YN == "yes"), 5),]
#// randomly sample 5 'no' answers
no <-  df[sample(which(df$YN == "no"), 5),]

#// create new dataframe with sampled answers
df_sub <- rbind(yes, no)
df_sub
#>     YN       val
#> 5  yes 33.925453
#> 19 yes 53.548253
#> 3  yes 68.057878
#> 15 yes 51.029700
#> 11 yes 91.768337
#> 10  no 11.923457
#> 8   no  8.467184
#> 12  no 63.233610
#> 16  no 93.375332
#> 2   no 98.342369

由reprex package (v0.3.0) 于 2021-01-07 创建

【讨论】:

谢谢!但我想根据前 500 个“是”和“否”的观察结果创建一个“平衡”样本,所以不是随机的,但无论如何感谢这个很好的例子! 通过对是和否采样相同的数字来获得余额(在示例中,sample 调用中的数字 5 - 您将选择 500)。如果您的答案的排列方式存在偏差,那么通过获取与您的搜索条件相匹配的第一个答案,您可能会在您的子集中引入该偏差并且无法实现平衡集。但您肯定比任何人都更了解您的数据。

以上是关于如何使用top_n进行条件提取的主要内容,如果未能解决你的问题,请参考以下文章

如何根据元素条件对提取的值进行排序

Top_n 返回最大值和最小值 - R

如何写一个条件,以便 sql 语句提取 2 小时前已解决的订单?

如何在EXCEL中提取唯一值

SQL server如何查询满足条件的前3数据

对具有相交组的小标题执行类似“top_n”的操作