【问题标题】:Can I use arithmetic when creating a matrix in R?在 R 中创建矩阵时可以使用算术吗?
【发布时间】:2021-10-30 06:15:31
【问题描述】:

我需要一些帮助来创建矩阵。我有一个包含多个组的大型数据集。每一组都分为病例和非病例。

例如

Group Cases Noncases
GroupA 4 7
GroupB 9 4
GroupC 10 3

我想创建一个矩阵,将一个组与其他组的总和进行比较。

例如:

Disease Category GroupA NotGroupA
Case 4 19
Noncase 7 7

我们的目标是建立一个矩阵,让我可以运行卡方检验和/或 Fisher 精确检验(取决于样本量)。

我已尝试使用以下代码将数据框中的值外推到矩阵中:

GroupA <- as.table(matrix(c(df[1,3], df[1,4], (sum(df$group_cases)-df$group_cases[1])), (sum(df$Noncases)-df$Noncases[1])), nrow=2, ncol=2,
                dimnames=list(Group= c("A", "Other"),
                              Case = c(1, 0)))

但是,我收到以下错误:

Warning message:
In matrix(c(df[1, 3], df[1, 4], (sum(df$group_cases) -  :
  data length [3] is not a sub-multiple or multiple of the number of rows [329]

它输出一个 329 行的列表,而不是一个 2 x 2 矩阵。

因为我有很多组,所以我希望 R 在构造矩阵时为我计算值。我不想单独计算“NotGroup_”列,因为这会为人为错误留出空间。

你们都建议如何构建这个矩阵,是否可以让 R 在创建矩阵时计算列的总和/减去值?

感谢您的帮助!

【问题讨论】:

    标签: r math matrix arithmetic-expressions chi-squared


    【解决方案1】:

    dplyr

    library(dplyr)
    library(tidyr) # pivot_*
    dat %>%
      mutate(Group = ifelse(Group == "GroupA", "GroupA", "NotGroupA")) %>%
      pivot_longer(-Group, names_to = c("Case")) %>%
      pivot_wider(Case, names_from = Group, values_from = value, values_fn = list(value = sum))
    # # A tibble: 2 x 3
    #   Case     GroupA NotGroupA
    #   <chr>     <int>     <int>
    # 1 Cases         4        19
    # 2 Noncases      7         7
    

    基础 R

    dat2 <- transform(dat, Group = ifelse(Group == "GroupA", "GroupA", "NotGroupA"))
    aggregate(. ~ Group, data = dat2, FUN = sum)
    #       Group Cases Noncases
    # 1    GroupA     4        7
    # 2 NotGroupA    19        7
    

    (虽然轴是相反的)


    数据

    dat <- structure(list(Group = c("GroupA", "GroupB", "GroupC"), Cases = c(4L, 9L, 10L), Noncases = c(7L, 4L, 3L)), class = "data.frame", row.names = c(NA, -3L))
    

    相关链接提供了多种“按组汇总”的方法:Calculate the mean by group

    【讨论】:

      【解决方案2】:

      设置示例:

      dd <- data.frame(Group = LETTERS[1:3], Cases = c(4, 9, 10),
                       Noncases = c(7,4,3))
      

      功能:

      mktab <- function(focal, data) {
          ## subset rows according to whether $Group == focal or not
          ## subset cols according to "Cases"/"Noncases"
          ## sum() the not-focal elements
          matrix(c(data[data$Group==focal, "Cases"],
                   sum(data[data$Group!=focal, "Cases"]),
                   data[data$Group==focal, "Noncases"],
                   sum(data[data$Group!=focal, "Noncases"])
                   ),
                 nrow = 2,
                 byrow=TRUE,
                 dimnames = list(c("Case", "Noncase"),
                                 c(focal, paste0("not_", focal)))
                 )
      }
      
      mktab("A", dd)
                   
      

      结果:

              A not_A
      Case    4    19
      Noncase 7     7
      

      【讨论】:

      • 谢谢——这解决了我的错误警告:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多