当前位置: 首页 > 知识库问答 >
问题:

具有“每个至少有一个”条件的随机行样本

秋和雅
2023-03-14

因此,我得到了一个如下所示的数据集:

a   b   c
23  34  Falcons
14  9   Hawks
2   18  Eagles
3   21  Eagles
22  8   Falcons
11  4   Hawks
23  34  Falcons
14  9   Hawks
3   21  Eagles
11  4   Hawks
2   18  Eagles
22  8   Falcons
14  9   Hawks
2   18  Eagles
3   21  Eagles

不会起作用,因为‘猎鹰’没有被代表。在R中有没有一种简单的方法可以做到这一点?

共有1个答案

叶炜
2023-03-14

您可以在这里为每个组指定n(如果您只想要一个具有nrows的数据帧,请使用1s==组数

dd <- read.table(header = TRUE, text = 'a   b   c
23  34  Falcons
14  9   Hawks
2   18  Eagles
3   21  Eagles
22  8   Falcons
11  4   Hawks', stringsAsFactors = FALSE)

(n <- setNames(c(1,2,1), unique(dd$c)))
# Falcons   Hawks  Eagles 
#       1       2       1 

set.seed(1)
dd[as.logical(ave(dd$c, dd$c, FUN = function(x)
  sample(rep(c(FALSE, TRUE), c(length(x) - n[x[1]], n[x[1]]))))), ]

#    a  b       c
# 1 23 34 Falcons
# 2 14  9   Hawks
# 4  3 21  Eagles
# 6 11  4   Hawks

把它放入一个函数中,为您自动化其他一些事情

sample_each <- function(data, var, n = 1L) {
  lvl <- table(data[, var])
  n1 <- setNames(rep_len(n, length(lvl)), names(lvl))
  n0 <- lvl - n1
  idx <- ave(as.character(data[, var]), data[, var], FUN = function(x)
    sample(rep(0:1, c(n0[x[1]], n1[x[1]]))))
  data[!!(as.numeric(idx)), ]
}

sample_each(dd, 'c', n = c(1,2,1))
#    a  b       c
# 1 23 34 Falcons
# 3  2 18  Eagles
# 5 22  8 Falcons
# 6 11  4   Hawks

sample_each(mtcars, 'gear', 1)
#                mpg cyl  disp  hp drat   wt  qsec vs am gear carb
# Valiant       18.1   6 225.0 105 2.76 3.46 20.22  1  0    3    1
# Merc 280      19.2   6 167.6 123 3.92 3.44 18.30  1  0    4    4
# Maserati Bora 15.0   8 301.0 335 3.54 3.57 14.60  0  1    5    8


sample_each(mtcars, 'gear', c(2,2,5))
#                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Hornet Sportabout  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# Porsche 914-2      26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
# Lotus Europa       30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
# Ford Pantera L     15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
# Ferrari Dino       19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
# Maserati Bora      15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
# Mazda RX4 Wag1     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Hornet Sportabout1 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# Merc 2801          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
 类似资料:
  • 我的任务是创建一个有100个随机数的新文件到一个每行有15个数字的新文件。我可以让它打印出100个随机数,但当我试图让它每行打印15个数字时,程序永远不会完成运行。

  • 问题内容: 雇员表具有ID和NAME列。名称可以重复。我想找出是否至少有一个名称类似“ kaushik%”的行。 因此查询应返回true / false或1/0。 是否可以使用单个查询找到它。如果我们尝试类似 在这种情况下,它不会返回true / false。另外,我们正在遍历表中的所有记录。简单SQL中是否存在这样的方式,使得每当获取满足条件的第一条记录时,它都应停止检查其他记录。还是只能在Pl

  • 我的条件... 字母数字值 只允许使用一个空格或连字符 必须包含至少一个数字 不能以空格或连字符开头或结尾 最少2个字符,最多16个字符,不包括空格/连字符 到现在为止,我准备了正则表达式 它只遗漏了第三点。 测试字符串有效 无效

  • 脚本会计算所有车辆识别号重复的次数 例如,如果VIN编号重复5次,则意味着将有五个零件到达,因此下一步是检查到达列中的VIN,如果有5个“是”值,则 (重复VIN编号)5/5(是”值的数量) 将触发它将[Master]选项卡零件订单列更改为“是”对于特定的VIN编号。 用户将手动更新[零件]选项卡,到达列时使用“是”或留空。(如果空白,则部分未到达。) 请参阅google工作表模板的链接:http

  • 我有一个mySQL查询,它将选择一些饮料并返回关于饮料的基本信息,以及该特定饮料的成分列表,以及该特定饮料的评级。我有三桌酒水,drinks_ratings,drinks_ing 所以,我的问题是,如果我想获得关于含有伏特加的饮料的信息,并且是在高球玻璃杯中,我会运行下面的查询... 它起作用了,只是我的问题是它没有返回所有的成分。例如,如果我返回“randomdrinkname1”,它碰巧有伏特

  • 我有值,我希望它们至少有两个十进制数字,但我不想修剪其余的数字。 是否有构建方法或更优雅的方法来实现这一点? 我不能使用,因为我希望在存在其他小数时保留它们。

  • 问题内容: 我需要找到属于特定条件的任何组的所有行。 我将一个组定义为在“组”列中共享一个值的几行。 相关组必须包含至少一行且Eligible设置为true的行,并且该组中至少有两行在Group或Eligible之外的任何列中必须彼此不同。 样表 所需结果 以下查询使我接近 问题在于它返回的结果太多,因为没有考虑该组中的记录之一是否被标记为合格。 我可能缺少一些简单的东西,但是我无法弄清楚如何检查

  • 我正在尝试从技能作业表中删除一行 以下是我的疑问 但它抛出以下错误; 致命错误:未捕获的异常'异常'消息'您有一个错误在您的SQL语法;检查手册,对应于您的MySQL服务器版本的正确的语法使用附近'skj内连接作业j上<--plhd--0/<--#############################################################################