r - 创建包含总计 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中有更简单更好的方法吗?谢谢!
解决方案
使用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
这也可以完成,base
但data.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
推荐阅读
- php - yii2上传文件给空白数组
- javascript - 带有 LineSegmentsGeometry 和 LineSegments2 的threejs linewidth 属性
- javascript - 在 calc() 函数中使用变量
- python - Python:如何将一个数字向下舍入到下一个 1000
- c# - 使用来自 seckeygeneratepair 的 publicKey 进行加密
- swift4 - ARKit 2.0 屏幕在使用“OverlaySKScene”时无响应
- javascript - 创建一个带有变量 url 的 href
- c++ - Qt QXmlStreamReader 访问冲突
- hadoop - 1个平面文件,不同的模式取决于一个值
- cmake - -D_FORCE_INLINES 添加在 run_nvcc.cmake 文件中没有消除编译错误