我们从以下形式的数据帧开始:

my_df <- structure(
  list(
    a = c(1, 1, 1, 2, 2, 2, 3, 3), 
    b = c('M1', 'M2', 'M3', 'M1', 'M2', 'M3', 'M1', 'M3'), 
    c = c(0, 0, 0, 1, 1, 0, 1, 1)
  ), 
  .Names = c("ID", "METHOD", "RESULT"), 
  row.names = c(NA, 8L), 
  class = "data.frame"
)

在这个简化的例子中,我们有三种方法(M1,M2,M3),三个个体(1,2,3,对于3,只有M1和M3的结果可用),以及两个可能的测试结果,0(否定的)和1(肯定的).我希望获得如下所示的输出:

M1 positive M1 negative M2 positive M2 negative M3 positive M3 negative
if M1 positive 100% (XX/XX) 0% (XX/XX) % (XX/XX) % (XX/XX) % (XX/XX) % (XX/XX)
if M1 negative 0% (XX/XX) 100% (XX/XX) % (XX/XX) % (XX/XX) % (XX/XX) % (XX/XX)
if M2 positive % (XX/XX) % (XX/XX) 100% (XX/XX) 0% (XX/XX) % (XX/XX) % (XX/XX)
if M2 negative % (XX/XX) % (XX/XX) 0% (XX/XX) 100% (XX/XX) % (XX/XX) % (XX/XX)
if M3 positive % (XX/XX) % (XX/XX) % (XX/XX) % (XX/XX) 100% (XX/XX) 0% (XX/XX)
if M3 negative % (XX/XX) % (XX/XX) % (XX/XX) % (XX/XX) 0% (XX/XX) 100% (XX/XX)

或者换句话说,我想知道一种方法的结果,比如说M1,与另一种方法的结果有多少一致.作为输出,我想得到(1)百分比(比如,如果M1为正,那么M3的22%也为正)和(2)绝对数字(例如,在1000例M1阳性中,220例M3阳性).因此,(XX/XX)代表,例如,在该特定示例中,M1的阳性数量/M3的阳性数量.

我已经采取了几种方法,试图利用If Else、If_Else和Case_When,但我正在寻找一种通用的方法,优先位于tidyVerse中的某个位置,它将提供数组--在某种程度上是交叉相关矩阵--我心里有.如能就如何汇总数据提供任何帮助,我们将不胜感激.

推荐答案

pacman::p_load(tidyverse, glue)

name_vals <- c("negative", "positive")

# join the data to itself, so every id, method, result row can see every other method and result with the same id
full_join(my_df, my_df, by = "ID", relationship = "many-to-many") |>
  count(METHOD.x, METHOD.y, RESULT.x, RESULT.y) |>

  # we need to complete the data, because the empty values in our final table have to be created using glue, using values_fiill doesn't work
  complete(METHOD.x, METHOD.y, RESULT.x, RESULT.y, fill = list(n = 0)) |>

  # create all the columns we will need for pivoting
  mutate(condition = glue("if {METHOD.x} is {name_vals[RESULT.x + 1]}"),
        name = glue("{METHOD.y} {name_vals[RESULT.y + 1]}"),
        value = glue("{round(n * 100 / max(sum(n), 1), 2)}% ({n}/{sum(n)})"), # max(sum(n), 1) because when a condition doesn't exist in our dataset, (for example, M3 positive in someone who also had M2), sum(n) == 0, dividing by zero gives us NaNs, which you probably don't want
        .by = c(METHOD.x, METHOD.y, RESULT.x))|>
  pivot_wider(id_cols = condition)

输出:

# A tibble: 6 × 7
  condition         `M1 negative` `M1 positive` `M2 negative` `M2 positive` `M3 negative` `M3 positive`
  <glue>            <glue>        <glue>        <glue>        <glue>        <glue>        <glue>       
1 if M1 is negative 100% (1/1)    0% (0/1)      100% (1/1)    0% (0/1)      100% (1/1)    0% (0/1)     
2 if M1 is positive 0% (0/2)      100% (2/2)    0% (0/1)      100% (1/1)    50% (1/2)     50% (1/2)    
3 if M2 is negative 100% (1/1)    0% (0/1)      100% (1/1)    0% (0/1)      100% (1/1)    0% (0/1)     
4 if M2 is positive 0% (0/1)      100% (1/1)    0% (0/1)      100% (1/1)    100% (1/1)    0% (0/1)     
5 if M3 is negative 50% (1/2)     50% (1/2)     50% (1/2)     50% (1/2)     100% (2/2)    0% (0/2)     
6 if M3 is positive 0% (0/1)      100% (1/1)    0% (0/0)      0% (0/0)      0% (0/1)      100% (1/1)

R相关问答推荐

从cv.glmnet R包中查找培训SSE

替换字符的所有实例,但仅限于匹配字符串中

如何生成包含可能条目列表而不是计数的表?

Select 与特定列中最大值对应的数据帧行

使用facet_wrap()时如何将面板标题转换为脚注?

在ComplexHeatmap中,如何更改anno_barplot()标题的Angular ?

如果行和大于值,则过滤

r—绘制相交曲线

警告:lmdif:info = 0. nls. lm()函数的输入参数不正确

在数学中正确显示摄氏度、开氏度或华氏度

单个轮廓重叠条的单独图例

如果可能,将数字列转换为整数,否则保留为数字

如何在分组条形图中移动相关列?

如何删除仅在数据集顶部和底部包含零的行

将箭头绘制在图形外部,而不是图形内部

减go R中列表的所有唯一元素对

Geom_arcbar()中出错:找不到函数";geom_arcbar";

将统计检验添加到GGPUBR中的盒图,在R

计算使一组输入值最小化的a、b和c的值

如何获取R chromote中的当前URL?