在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
相关产品推荐
相关产品推荐

