我有一个这样的数据框;
df <- data.frame(concentration=c(0,0,0,0,2,2,2,2,4,4,6,6,6),
result=c(0,0,0,0,0,0,1,0,1,0,1,1,1))
我想计算每个浓度水平的结果总数。 我想计算每个浓度水平的阳性样品数。 我想创建一个新的数据框,其中包含浓度水平,总结果和正数。
conc pos_c total_c
0 0 4
2 1 4
4 1 2
6 3 3
这是我到目前为止使用plyr得出的结论;
c <- count(df, "concentration")
r <- count(df, "concentration","result")
names(c)[which(names(c) == "freq")] <- "total_c"
names(r)[which(names(r) == "freq")] <- "pos_c"
cbind(c,r)
concentration total_c concentration pos_c
1 0 4 0 0
2 2 4 2 1
3 4 2 4 1
4 6 3 6 3
重复浓度列。我认为可能有一种更好/更轻松的方式来实现此目的,而我却不这么想。也许是另一个图书馆。我不确定如何在R中执行此操作,这对我来说还比较陌生。谢谢。
答案 0 :(得分:3)
我们需要一个sum
分组。使用tidyverse
,我们按'浓度(group_by
)分组,然后按summarise
分组以得到逻辑表达式(sum
的两列-1)result > 0
,2)行数(n()
)
library(dplyr)
df %>%
group_by(conc = concentration) %>%
summarise(pos_c = sum(result > 0), # in the example just sum(result)
total_c = n())
# A tibble: 4 x 3
# conc pos_c total_c
# <dbl> <int> <int>
#1 0 0 4
#2 2 1 4
#3 4 1 2
#4 6 3 3
或者将base R
与table
和addmargins
一起使用
addmargins(table(df), 2)[,-1]