条件计数R.如果两行== TRUE,则添加

时间:2017-07-25 21:30:32

标签: r dplyr

我有两种不同采样方法的细菌菌落计数(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]],...):   仅在具有所有数字变量的数据框上定义

3 个答案:

答案 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