создать фрейм данных, содержащий строки, которые добавляют до 100 - PullRequest
0 голосов
/ 17 января 2019

Это мой первый удар в этом:

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? спасибо!

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вот простая функция. Вы можете указать, сколько строк / столбцов вы хотите, и для чего каждая строка суммируется.

func <- function(cols = 3, rows = 10, rowTotal = 100) {
  dt1 <- replicate(n = cols, runif(n = rows))
  dt1 <- data.frame(apply(X = dt1, MARGIN = 2, FUN = function(x) x / rowSums(dt1) * rowTotal))
  return(dt1)
}

rowSums(func()) # default values (3 cols, 10 rows, each row sums to 100) 
rowSums(func(cols = 5, rows = 10, rowTotal = 50)) # 5 cols, 10 rows, row sums to 50)
0 голосов
/ 17 января 2019

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...