如何使用 top_n 进行条件提取

问题描述

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

我试过这个代码

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

但是这个选择所有的yes而不是前500个 我也试过这个,但这给了我一个错误,尽管我确定它没有意义

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

解决方法

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

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

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

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

,

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

#// 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"),]

#// 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 年 1 月 7 日创建

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...