多个摘要计数和一个跨可变行数的标志
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
我的出发点如下:
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