如何在R中生成和为指定值的随机整数向量并添加至数据框
生成指定总和的随机整数列(Tidyverse风格)
假设你需要的目标总和为target_sum(示例设为500),可以用以下代码实现需求:
library(dplyr) library(magrittr) # 设定目标总和 target_sum <- 500 my_df %<>% mutate( # 生成前n-1个随机正整数,预留空间保证最后一个数≥1 temp = case_when( row_number() < n() ~ sample.int(target_sum - (n() - 1), n() - 1, replace = TRUE), TRUE ~ NA_integer_ ), # 计算最后一个数,确保整列和为设定值 my_new_column = case_when( row_number() < n() ~ temp, TRUE ~ target_sum - sum(temp, na.rm = TRUE) ) ) %>% select(-temp) # 删除临时列
关键逻辑说明
- 正整数保障:
sample.int(target_sum - (n()-1), ...)限制了前n-1个数的最大值,确保最后一个数target_sum - sum(temp)必然≥1,避免出现非正整数。 - 精准总和控制:通过最后一个数补全总和,保证整列求和严格等于
target_sum。 - Tidyverse风格兼容:全程使用
dplyr函数链,匹配你的代码书写习惯。
验证结果
执行以下代码确认求和是否符合预期:
sum(my_df$my_new_column) # 输出应为设定的target_sum值
如果允许随机数包含0,可简化逻辑,去掉- (n()-1)的限制:
my_df %<>% mutate( temp = case_when( row_number() < n() ~ sample.int(target_sum, n() - 1, replace = TRUE), TRUE ~ NA_integer_ ), my_new_column = case_when( row_number() < n() ~ temp, TRUE ~ target_sum - sum(temp, na.rm = TRUE) ) ) %>% select(-temp)
内容的提问来源于stack exchange,提问作者Faustin Gashakamba
相关产品推荐
相关产品推荐

