当前位置: 首页 > 知识库问答 >
问题:

对数据使用Lappy(或任何替代方案)。表一次生成多个列

闻慎之
2023-03-14

我有数据。包含多个变量(列)及其标准错误的表。我想计算一些东西,比如加权平均值,标准误差的平均值,p值。。。

玩具示例:

myDT <- data.table(ID=1:8, AA=21:28, BB=31:38, CC=41:48, stdAA=(11:18)/10, 
    stdBB=(11:18)/10, stdCC=(11:18)/10)
mycol <- c("AA", "BB", "CC")   # Select these ones.


   ID AA BB CC stdAA stdBB stdCC
1:  1 21 31 41   1.1   1.1   1.1
2:  2 22 32 42   1.2   1.2   1.2
3:  3 23 33 43   1.3   1.3   1.3
4:  4 24 34 44   1.4   1.4   1.4
5:  5 25 35 45   1.5   1.5   1.5
6:  6 26 36 46   1.6   1.6   1.6
7:  7 27 37 47   1.7   1.7   1.7
8:  8 28 38 48   1.8   1.8   1.8

OUTPUT1 <- myDT[,.(Variables=mycol,Estimate=lapply(mycol, 
   function (x) weighted.mean(get(x), 1/(get(paste0("std",x)))^2 ) ),
   Std.Error=lapply(mycol, function (x) mean(get(paste0("std",x)))))]  
OUTPUT1[,tvalue := as.numeric(Estimate)/as.numeric(Std.Error) ][,pvalue := 2*pt(-abs(tvalue),df=7)]


   Variables Estimate    Std.Error  tvalue       pvalue
        AA    23.76617      1.45   16.39046   7.671357e-07
        BB    33.76617      1.45   23.28702   6.833554e-08
        CC    43.76617      1.45   30.18357   1.129896e-08

我后来计算了最后两列,因为它们需要之前计算的值,但有一个问题,它会产生一个错误“非数值参数到二进制运算符”,这就是我使用“as.numeric”的原因。我想问题是生成的数据。表包含列表而不是向量。我希望使用更简单的语法,将所有内容插入同一个lappy中。

我该怎么做?

下面的代码没有产生预期的输出,因为它在第二列的每个元素上插入了一个向量,所以我无法进一步使用它。

OUTPUT2 <- myDT[,.(mycol,lapply(mycol, function (x) 
  c(weighted.mean(get(x),1/(get(paste0("std",x)))^2 ),
   mean(get(paste0("std",x))) )))]

也许我需要添加某种rbindlist,但我无法正确执行。

我的下一次尝试虽然不短,但效果很好。(而且我没有事件添加列,因为它们被删除了,我需要稍后添加它们)

OUTPUT3 <- data.table(mycol,t(myDT[,c(lapply(mycol,
        function (x) .(weighted.mean(get(x),1/(get(paste0("std",x)))^2 ), 
           mean(get(paste0("std",x))))))]))
OUTPUT3[,tvalue := as.numeric(V1)/as.numeric(V2)][,pvalue := 2*pt(-abs(tvalue),df=7)]

在一个单圈内进行所有计算将是非常棒的。

共有2个答案

向弘懿
2023-03-14

有人可能会想出更优雅的东西。但是如果目标是计算单个< code>lapply中的所有内容:

library(data.table)
library(magrittr)

myDT <- data.table(ID=1:8, AA=21:28, BB=31:38, CC=41:48, stdAA=(11:18)/10, 
                   stdBB=(11:18)/10, stdCC=(11:18)/10)

mycol <- c("AA", "BB", "CC")   # Select these ones.

newCols <- c("Estimate", "Std.Error", "tvalue", "pvalue")

myDT[, .(lapply(mycol, function(x){
  estimate <- weighted.mean(get(x), 1/(get(paste0("std",x)))^2 )
  std.error <- mean(get(paste0("std",x)))
  tvalue <- estimate/std.error
  pvalue <- 2*pt(-abs(tvalue),df=7)
  out <- list(estimate, std.error, tvalue, pvalue)
  return(out)
}))] %>% rbindlist %>% 
  t(.) %>% 
  as.data.table(.) %>% 
  setnames(., names(.), newCols) %>% .[] # visualize table
蒋鹏鹍
2023-03-14

如果先融化它呢?这大大简化了问题:

melt(
  melt(myDT, 1:4, 5:7, 'Variable', 'StdError'), 
  c(1, 6),
  c('AA', 'BB', 'CC'),
  'Variable',
  'Estimate'
    )[, .(Variable, Estimate, StdError)
    ][
      , .(Estimate = weighted.mean(Estimate, 1 / StdError^2),
          StdError = mean(StdError)),
        .(Variable)
    ][
      , `:=`(tvalue    =  Estimate / StdError,
             pvalue    = 2 * pt(-abs(Estimate / StdError), df = 7)),
        .(Variable)
    ]

   Variable Estimate StdError   tvalue       pvalue
1:       AA 23.76617     1.45 16.39046 7.671357e-07
2:       BB 33.76617     1.45 23.28702 6.833554e-08
3:       CC 43.76617     1.45 30.18357 1.129896e-08
 类似资料:
  • 我陷入了关于是否使用MongoDB或Cassandra来满足我的数据库需求的具体决定之间,并希望对我的用例进行输入以指导我的决定。 要求: 数据源 X个包含Y个服务器的数据中心。 每个服务器有N个网络和M个统计数据。 e、 g.目前(3个数据中心、50台服务器、19个网络和10个统计数据)。这些数字会随着时间的推移而增加。 数据获取: 每小时为每台服务器解析一个xml页面(约20kb/页)。(~2

  • 我对ES很陌生。我一直在寻找数据库迁移工具,但找不到。我想知道是否有人能帮我指出正确的方向。 我会使用 Elasticsearch 作为项目中的主数据存储。我想对所有映射和配置更改/数据导入/数据升级脚本进行版本控制,这些脚本是我在项目中开发新模块时运行的。 过去,我使用Flyway或Liquibase等数据库版本控制工具。 有没有任何框架/脚本或方法可以与ES一起使用来实现类似的目标? 有没有人

  • 这是为什么BigQuery在小数据集上表现不好的问题的后续问题。 假设我有一个大约1百万行的数据集。在我们当前使用的数据库(mysql)中,聚合查询的运行速度非常慢,可能需要大约10秒的时间进行复杂的聚合。在BigQuery上,所需的初始化时间可能会使此查询花费约3秒,比mysql要好,但如果我们需要在1s或更短时间内返回查询,则此工具不适合此作业。 那么,我的问题是,在对中等大小的数据集(如10

  • 我们正在改变数据库,从一个支持8位int的数据库到一个不支持8位int的数据库。当Liquibase创建一个DB导致jOOQ生成“短”变量时,我们的代码会中断,但我们的代码使用字节/字节-这会中断代码签名。 有人建议我们继续使用以前的数据库(HSQLDB)来生成代码,而不是重新编码,它“应该”与新数据库一起运行。有不同的意见,除了直觉,我找不到任何决定性的东西,这似乎与jOOQ的设计目的背道而驰。

  • 我正在尝试用Tkinter编写我的第一个基于GUI的python程序。我已经创建了一个基本窗口,它持有菜单栏和几个选项。 其中一个选项是一个标准的“about”框。当我用 它打开消息框,但在一个新窗口中,因此现在任务栏上显示了两个窗口。有没有办法阻止它打开一个新窗口而使用主窗口代替,或者有没有更好的办法来做这件事? null null null

  • 网上多数都是Koa与Express的对比。Koa是Express框架原班人马基于ES6新特性重新开发的敏捷开发框架。 想了解一下koa与java的对比情况是怎样的? 比如koa只是前端一个简易的替代方案?java开发后端是否更专业?