【问题标题】:R. lapply multinomial test to list of dataframesR. lapply 多项式测试到数据帧列表
【发布时间】:2018-11-10 00:21:01
【问题描述】:

我有一个数据框A,我将其拆分为一个包含 100 个数据框的列表,每个数据框有 3 行(在我的真实数据中,每个数据框有 500 行)。在这里,我展示了带有 2 个列表元素的 A (row1-row3; row4-row6):

A <- data.frame(n = c(0, 1, 2, 0, 1, 2),
                prob = c(0.4, 0.5, 0.1, 0.4, 0.5, 0.1),
                count = c(24878, 33605, 12100 , 25899, 34777, 13765))

# This is the list:
nest <- split(A, rep(1:2, each = 3))

我想对这些数据帧中的每一个应用多项检验并提取每个检验的 p 值。到目前为止,我已经这样做了:

library(EMT)

fun <- function(x){
  multinomial.test(x$count,
                   prob=x$prob,
                   useChisq = FALSE, MonteCarlo = TRUE,
                   ntrial = 100, # n of withdrawals accomplished
                   atOnce=100)
}

lapply(nest, fun)

但是,我得到:

 "Error in multinomial.test(x$counts_set, prob = x$norm_genome, useChisq = F,  : 
   Observations have to be stored in a vector, e.g.  'observed <- c(5,2,1)'"

有人有更聪明的方法吗?

【问题讨论】:

  • 我在运行您的代码时没有收到错误消息。

标签: r dataframe lapply multinomial


【解决方案1】:

split 的结果是使用名称12 等创建的。这就是为什么fun 中的x$count 无法访问它的原因。为了更简单,您可以使用list 函数组合拆分的元素,然后使用lapply

n <- c(0,1,2,0,1,2)
prob <- c(0.4, 0.5, 0.1, 0.4, 0.5, 0.1)
count <- c(24878, 33605, 12100 , 25899, 34777, 13765)
A <- cbind.data.frame(n, prob, count)

nest = split(A,rep(1:2,each=3))

fun <- function(x){
  multinomial.test(x$count,
                   prob=x$prob,
                   useChisq = F, MonteCarlo = TRUE,
                   ntrial = 100, # n of withdrawals accomplished
                   atOnce=100)
}

# Create a list of splitted elements
new_list <- list(nest$`1`, nest$`2`)

lapply(new_list, fun)

【讨论】:

    【解决方案2】:

    使用 dplyr 的解决方案。

    A = data.frame(n = c(0,1,2,0,1,2),
                   prob = c(0.4, 0.5, 0.1, 0.4, 0.5, 0.1),
                   count = c(43, 42, 9, 74, 82, 9))
    
    library(dplyr)
    nest <- A %>%
      mutate(pattern = rep(1:2,each=3)) %>%
      group_by(pattern) %>%
      dplyr::summarize(mn_pvals = multinomial.test(count, prob)$p.value)
    nest
    

    【讨论】:

    • 嗨@paoloeusebi,您的解决方案也很有效,但Vishesh 首先发布了一个解决方案。非常感谢
    • 最重要的是你有两个解决方案,我学到了一些新东西。
    • 很高兴听到这个消息!
    猜你喜欢
    • 2020-09-11
    • 2020-05-21
    • 2013-10-15
    • 1970-01-01
    • 2018-06-08
    • 2017-06-27
    • 1970-01-01
    • 2020-02-18
    • 2020-04-04
    相关资源
    最近更新 更多