You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R数据框中按两种不同概率筛选行的技术求助

解决方案

我来帮你搞定这个抽样问题!你遇到的错误核心原因很明确:sample_n()的weight参数需要一个长度和数据框行数完全一致的向量——每一行都得对应一个权重值,而不是只给两个全局权重。下面是完整的实现步骤:

步骤1:生成数据并计算每行均值

先按你的代码生成原始数据,再新增一列存储每行的均值,方便后续判断条件:

library(tidyr)
library(dplyr)  # 记得加载dplyr,因为要用到mutate、sample_n等函数

# 生成原始数据
df <- data.frame(replicate(6, sample(1:10, 1000, rep = TRUE)))

# 计算每行均值并添加到数据框
df <- df %>%
  mutate(row_mean = rowMeans(.))

步骤2:生成匹配行数的权重向量

根据你设定的概率规则,给每一行分配对应的权重:

  • 行均值≥6的行,权重设为0.8(也可以用相对权重8,因为sample_n的权重是相对值,最终效果一致)
  • 行均值<6的行,权重设为0.2(或相对权重2)

这里用case_when来批量生成权重向量:

df <- df %>%
  mutate(sample_weight = case_when(
    row_mean >= 6 ~ 0.8,
    row_mean < 6 ~ 0.2
  ))

步骤3:按权重抽取30行样本

现在直接调用sample_n(),指定weight = sample_weight即可——这个向量的长度和df的行数完全匹配,不会再报错:

set.seed(123)  # 设置随机种子,保证抽样结果可复现
xsample <- df %>%
  sample_n(size = 30, weight = sample_weight, replace = TRUE)

额外提示

如果你实际需求里还保留偏度筛选的条件(你之前代码里用到了rowSkewness),只需要在抽样前加一步过滤即可,记得先加载fBasics包:

library(fBasics)

set.seed(123)
xsample <- df %>%
  filter(rowSkewness(.) > 1.5) %>%
  sample_n(size = 30, weight = sample_weight, replace = TRUE)

内容的提问来源于stack exchange,提问作者JPMD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:24:44