我有两种不同采样方法的细菌菌落计数(ACCN)数据框:拭子和平板。我想计算一系列标准中两种方法的菌落计数一致的时间(例如,如果ACCN <=&#34; 2.5&#34;等)。
head(EA)
sample group ACCN
1 E 1 14.84500
2 S 1 2.07500
3 E 2 13.70167
4 S 2 6.60000
5 E 3 11.45833
6 S 3 7.90000
到目前为止,我已经:
S<-(EA$ACCN<="2.5" & EA$sample=="S")
P<-(EA$ACCN<="2.5" & EA$sample=="P")
PE<-cbind(S,P)
PE<-as.data.frame(PE)
sum(PE)
但收到此错误: FUN错误(X [[i]],...): 仅在具有所有数字变量的数据框上定义
答案 0 :(得分:2)
使用dplyr:
library(dplyr)
EA %>%
mutate(S = ifelse(as.numeric(ACCN) <= 2.5 & sample == "S", 1, 0)) %>%
mutate(P = ifelse(as.numeric(ACCN) <= 2.5 & sample == "P", 1, 0)) %>%
summarise(PE_sum = sum(S, P))
但是,如果您只想要数据框,那么:
EA %>%
mutate(S = ifelse(as.numeric(ACCN) <= 2.5 & sample == "S", 1, 0)) %>%
mutate(P = ifelse(as.numeric(ACCN) <= 2.5 & sample == "P", 1, 0))
如果你不在乎有一个独特的&#34; P&#34;和一个&#34; S&#34;专栏,你可以更简洁地写出来:
EA %>%
mutate(new = ifelse(as.numeric(ACCN) <= 2.5 & sample %in% c("S", "P"), 1, 0)) %>%
summarise(new_sum = sum(new))
或者只使用您已有的东西:
S<-(EA$ACCN<="2.5" & EA$sample=="S")
P<-(EA$ACCN<="2.5" & EA$sample=="P")
但是,那么:
sum(S, P)
或者:
S<-(EA$ACCN<="2.5" & EA$sample=="S")
P<-(EA$ACCN<="2.5" & EA$sample=="P")
PE<-cbind(S,P)
但是:
sum(PE) # keeping the object a matrix, not spinning it into a dataframe.
要获得总和,对于每个值从1到30(可选),根据您在评论部分中的问题,答案可能是:
library(dplyr)
x <- 1:30
(sapply(x, function(x) {ifelse(as.numeric(EA$ACCN) <= x & EA$sample == "S", 1, 0)}) +
sapply(x, function(x) {ifelse(as.numeric(EA$ACCN) <= x & EA$sample == "P", 1, 0)})) %>%
as.data.frame() %>%
summarise_all(sum)
虽然我不知道您正在寻找的输出的确切结构。
答案 1 :(得分:1)
错误消息来自sum函数 - 它将vector作为参数而不是数据帧。直接求和逻辑向量:
sum(S)
[1] 2
sum(P)
[1] 3
sum(S & P)
[1] 0
答案 2 :(得分:1)
我认为你可能使这个问题比你想象的更复杂。听起来你想过滤掉一些数据并进行测试。
从数据开始:
EA <- read.table(text=' ACC ACCN sample
+ 1 SG 1.50 S
+ 2 LG 7.25 S
+ 3 SG 1.50 S
+ 4 NG 0.00 P
+ 5 SG 1.50 P
+ 6 SG 1.50 P ')
过滤并拆分/应用/合并:
> EA %>%
filter(ACCN <= 2.5) %>%
group_by(sample) %>%
summarise(count=n())
# A tibble: 2 × 2
sample count
<fctr> <int>
1 P 3
2 S 2
如果你想要边距(即符合标准的样本百分比),那么你可能会有点棘手
> EA %>% group_by(sample) %>% summarise(pct=sum(ACCN <= 2.5) / n())
# A tibble: 2 × 2
sample pct
<fctr> <dbl>
1 P 1.0000000
2 S 0.6666667