通过不同变量的不同功能创建多列。

我有麻烦过渡到 data.table. 我试图通过一些分类变量进行分组,并应用一个函数列表,每个函数针对不同的变量,以创建新的列。 这似乎是一件很容易的事情,通过使用 mapplyMap但我不知道如何在函数中组合出合适的子集来传递给函数。

下面是它的样子。

set.seed(2015)
dat <- data.table(cat1 = factor('Total'),
                  cat2 = factor(rep(letters[1:4], 5)),
                  cat3 = factor(rep(1:4, each=5)),
                  var1 = sample(20),
                  var2 = sample(20),
                  var3 = sample(20))

## I have list of factor columns to group by
groups <- c(paste0("cat", 1:3))
setkeyv(dat, groups)

## List of functions, and corresponding list of column names that
## they are to be applied to.  So, in this example I should get
## two new columns: V1=sum(var1) and V2=mean(var2, var3)
thing <- function(...) mean(c(...), na.rm=TRUE)  # arbitrary function
funs <- list("sum", "thing")                     # named functions
targets <- list("var1", c("var2", "var3"))       # variables
outnames <- funs                                 # names or result columns

## Can't get this part
f <- function(fn, vars) do.call(fn, vars)
dat[, outnames := Map(f, funs, targets), by=groups]

这个例子的结果应该是这样的

dat[, `:=`(sum=sum(var1), thing=thing(var2, var3)), by=groups]

解决方案:

我们需要根据 “target “中的列名来对数据集的列进行子集。list. 一种方法是将循环通过 list 的元素,并将data.table(.SD[, x, with=FALSE]),然后应用该函数。

dat[, unlist(outnames) := Map(f, funs, lapply(targets, function(x)
                          .SD[, ..x])), by = groups]

给TA打赏
共{{data.count}}人
人已打赏
未分类

golang goroutines,chanel和sync.WaitGroup。

2022-9-8 17:36:22

未分类

我怎样才能使这个Wasm函数用它的母语容易阅读?

2022-9-8 17:47:36

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索