首页 > 解决方案 > 创建包含总计 100 行的数据框

问题描述

这是我的第一次尝试:

library(dplyr)

step_size <- 5

grid <- expand.grid(
    x1 = seq(0, 100, step_size)
    , x2 = seq(0, 100, step_size)
    , x3 = seq(0, 100, step_size)
)

grid$sum = grid$x1 + grid$x2 + grid$x3
grid$x1 <- (grid$x1 / grid$sum) * 100
grid$x2 <- (grid$x2 / grid$sum) * 100
grid$x3 <- (grid$x3 / grid$sum) * 100
grid$sum <- grid$x1 + grid$x2 + grid$x3

nrow(grid)

result <- distinct(grid) %>% filter(!is.na(sum))

head(result, 20)
nrow(result)

基本上,我想创建一个数据框,其中包含尽可能多的行,加起来为 100 并且均匀分布。

R中有更简单更好的方法吗?谢谢!

标签: r

解决方案


使用data.table...

library(data.table)

grid <- expand.grid(
  x1 = seq(0, 100)
  , x2 = seq(0, 100)
  , x3 = seq(0, 100)
)

setDT(grid)

res <- grid[grid[, rowSums(.SD) == 100], ]
res[, summation := rowSums(.SD)]

结果:

> res[, unique(summation)]
[1] 100

这也可以完成,basedata.table速度更快:

library(data.table)

grid <- expand.grid(
  x1 = seq(0, 100)
  , x2 = seq(0, 100)
  , x3 = seq(0, 100)
)


grid2 <- expand.grid(
  x1 = seq(0, 100)
  , x2 = seq(0, 100)
  , x3 = seq(0, 100)
)

setDT(grid)

microbenchmark::microbenchmark(
  data.table = {        
    res <- grid[grid[, rowSums(.SD) == 100], ]
  },
  base = {
    res2 <- grid2[rowSums(grid2) == 100, ]
  }
)

Unit: milliseconds
       expr      min       lq     mean   median       uq      max neval cld
 data.table 59.41157  89.6700 109.0462 107.7415 124.2675 183.9730   100  a 
       base 65.70521 109.6471 154.1312 125.4238 156.9168 611.0169   100   b

推荐阅读