多个摘要计数和一个跨可变行数的标志

Multiple summary counts and a flag across variable number of rows

我的出发点如下:

id.s <- c(1,1,2,2,2,3,3,3,3,4,4,4)
test.s <- c("Negative", "Positive", "Positive", "Negative", "Positive",
        "Negative", "Negative", "Negative", "Positive", "Negative",
        "Negative", "Negative")
Start <- as.data.frame(cbind(id.s,test.s))

我正在尝试:

id.f <- c(1,2,3,4)
Number.Of.Visits <- c(2,3,4,3)
Positive.Test <- c("Yes", "Yes", "Yes", "No")
Num.Positive <- c("1", "2", "1", "0")
finish <- as.data.frame(cbind(id.f, Number.Of.Visits, Positive.Test, Num.Positive))

有效: (1) ID可以多次访问测试 (2) 他们可以测试 positive/negative 任何给定的访问 (3) 我需要知道每个 ID (a) 访问次数,(b) 是否有任何阳性测试,以及 (c) 有多少阳性测试。

我确信我让这件事变得比应该的更难了。我可以设想伪代码,但无法将其转换为 R。

非常感谢任何帮助。

我们可以通过'id.s'进行分组,使用summarise获取行数(n(),然后检查是否有any 'Positive' %in% 'test.s',以及通过取逻辑 vector

sum 得到 'Positive' 的计数
library(dplyr)
Start %>%
   group_by(id.s) %>%
   summarise(NumberOfVisits = n(),
             Positive.Test = c('No', 'Yes')[1 + ('Positive' %in% test.s)], 
            Num.Positive = sum(test.s == 'Positive'), .groups = 'drop')

-输出

# A tibble: 4 x 4
#  id.s  NumberOfVisits Positive.Test Num.Positive
#  <chr>          <int> <chr>                <int>
#1 1                  2 Yes                      1
#2 2                  3 Yes                      2
#3 3                  4 Yes                      1
#4 4                  3 No                       0

data.table 选项 dcast

dcast(
  setDT(Start), id.s ~ test.s
)[
  , `:=`(
    NumVisits = rowSums(.SD),
    PostiveTest = c("No", "Yes")[1 + (Positive > 0)]
  ),
  .SDcols = -1
][
  , Negative := NULL
][]

给予

   id.s Positive NumVisits PostiveTest
1:    1        1         2         Yes
2:    2        2         3         Yes
3:    3        1         4         Yes
4:    4        0         3          No