gpt4 book ai didi

R 在data.table(或ddply)中动态构建 "list"

转载 作者:行者123 更新时间:2023-12-03 02:59:10 24 4
gpt4 key购买 nike

我的聚合需求因列/数据帧而异。我想动态地将“list”参数传递给 data.table。

作为一个最小的例子:

require(data.table)
type <- c(rep("hello", 3), rep("bye", 3), rep("ok",3))
a <- (rep(1:3, 3))
b <- runif(9)
c <- runif(9)
df <- data.frame(cbind(type, a, b, c), stringsAsFactors=F)
DT <-data.table(df)

此调用:

DT[, list(suma = sum(as.numeric(a)), meanb = mean(as.numeric(b)), minc = min(as.numeric(c))), by= type]

将得到与此类似的结果:

    type suma     meanb      minc
1: hello 6 0.1332210 0.4265579
2: bye 6 0.5680839 0.2993667
3: ok 6 0.5694532 0.2069026

future 的 data.frames 将有更多的列,我想以不同的方式进行总结。但是为了处理这个小例子:有没有办法以编程方式传递列表?

我天真地尝试过:

# create a different list
mylist <- "list(lengtha = length(as.numeric(a)), maxb = max(as.numeric(b)), meanc = mean(as.numeric(c)))"
# new call
DT[, mylist, by=type]

出现以下错误:

1: hello
2: bye
3: ok
mylist
1: list(lengtha = length(as.numeric(a)), maxb = max(as.numeric(b)), meanc = mean(as.numeric(c)))
2: list(lengtha = length(as.numeric(a)), maxb = max(as.numeric(b)), meanc = mean(as.numeric(c)))
3: list(lengtha = length(as.numeric(a)), maxb = max(as.numeric(b)), meanc = mean(as.numeric(c)))

任何提示表示赞赏!谨致问候!

PS 对这些 as.numeric() 感到抱歉,我不太明白为什么,但我需要它们来运行示例。

小编辑在首句中的 data.frame 之前插入列/以澄清我的需求。

最佳答案

这已解释FAQ 1.6您正在寻找的是 quoteeval

类似的东西

 mycall <- quote(list(lengtha = length(as.numeric(a)), maxb = max(as.numeric(b)), meanc = mean(as.numeric(c))))

DT[, eval(mycall)]

经过一番绞尽脑汁之后,这是一种使用 .() 构建 ddply 调用的非常丑陋的方法

myplyrcall <- .(lengtha = length(as.numeric(a)), maxb = max(as.numeric(b)), meanc = mean(as.numeric(c)))

do.call(ddply,c(.data = quote(DF), .variables = 'type',.fun = quote(summarise),myplyrcall))

您还可以使用 as.quoted ,它具有 as.quoted.character 方法,使用 paste0 进行构造

myplc <-as.quoted(c("lengtha" = "length(as.numeric(a))", "maxb" = "max(as.numeric(b))", "meanc" = "mean(as.numeric(c))"))

这也可以与 data.table 一起使用!

dtcall <- as.quoted(mylist)[[1]]


DT[,eval(dtcall), by = type]

data.table 一直如此。

关于R 在data.table(或ddply)中动态构建 "list",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com