我有一个表格,我想随机标记每组的三条记录为1,所有其他记录为0.

我知道我可以用下面的代码来实现这一点,但这看起来很笨拙,效率也很低.我还有别的方法可以完成同样的事情吗?

library(tidyverse)
dat <- data.frame(row_id = 1:10,
           grp = c(rep("a", 5), rep("b", 5)))

dat_sample <- dat %>% 
  group_by(grp) %>% 
  sample_n(3) %>% 
  mutate(val = 1)

dat %>% 
  left_join(dat_sample, by = c("row_id", "grp")) %>% 
  mutate(val = coalesce(val, 0))

推荐答案

一个选项是用mutate代替连接,即用'grp'分组,samplerow_number()并创建一个逻辑向量,该逻辑向量被强制为带as.integer+的二进制

library(dplyr)
dat %>%
   group_by(grp) %>% 
   mutate(val = +(row_number() %in% sample(row_number(), 3))) %>%
   ungroup

或者

dat %>%
    group_by(grp) %>%
    mutate(val = rbinom(n(), 1, 0.3)) %>%
    ungroup

R相关问答推荐

S用事件解决物质平衡问题

如何计算多个日期是否在一个日期范围内

用关联字符串替换列名的元素

更新R中的数据表(使用data.table)

将标识符赋给事件序列,避免错误观察

随机森林的带Shap值的蜂群图

将具有坐标列表列的三角形转换为多个多边形

如何提取R中其他字符串和数字之间的字符串?

如何使投篮在R中保持一致

如何将图例文本添加到图例符号中

组合名称具有模式的列表的元素

将R中对象的CSV数组转换为JSON数组

合并多个数据帧,同时将它们的名称保留为列名?

使用dplyr删除具有条件的行

R Bupar:获取每个 case 的踪迹

如何从R调用Amazon销售合作伙伴API?

将一个字符串拆分成R中的两行或多行,同时复制其他列

从TestThat::Expect_EQUAL()获得更有用的输出

在自定义ggplot2中自动检测离散或连续调色板

为什么renv找不到某些软件包版本?