【问题标题】:Conditional counting R. Add if both rows==TRUE条件计数 R. 如果两行 ==TRUE 则添加
【发布时间】:2017-07-25 21:30:32
【问题描述】:

我有一个来自两种不同采样方法的细菌菌落计数 (ACCN) 数据框:拭子和平板。我想计算一下菌落计数对于一系列标准的两种方法一致的时间(例如,如果 ACCN

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]], ...) 中的错误: 仅在具有所有数值变量的数据框上定义

【问题讨论】:

  • 试试PE&lt;-cbind(as.numeric(S),as.numeric(P))等。请注意,考虑到问题的主题行,我不确定您是否不想要?rowSums
  • 也许可以构建一个更简单的示例并准确显示您想要得到的结果?我看到的方法的主要问题是,当其中一种示例方法超过标准而另一种方法没有超过标准时,您会怎么做——这是不匹配还是匹配?
  • @user295691 不匹配
  • 我应该更清楚——我不是指 ACCN 是否匹配的“匹配”,而是标准“

标签: r dplyr


【解决方案1】:

使用 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))

如果你不关心有一个不同的“P”和一个“S”列,你可以写得更简洁:

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)

虽然我不知道您正在寻找的输出的确切结构。

【讨论】:

  • 为什么是as.numeric(ACCN)?为什么不用as.numeric(ACCN &lt;= 2.5 &amp; sample == "S") 而不是ifelse
  • 因为“样本”变量要么是因子,要么是字符类?
  • 但是sample == "S"logical
  • @HCAI: x &lt;- 1:30; sapply(x, function(x) {ifelse(as.numeric(EA$ACCN &lt;= x &amp; EA$sample == "S"), 1, 0)}) 不过,我不知道你想要的输出的确切结构。
  • @HCAI:检查编辑以获取 1 到 30 方案的答案。
【解决方案2】:

错误消息来自 sum 函数——它将向量而不是数据框作为参数。直接对逻辑向量求和:

sum(S)
[1] 2

sum(P)
[1] 3

sum(S & P)
[1] 0

【讨论】:

    【解决方案3】:

    我认为您可能使这个问题比您预期的更复杂。听起来您想过滤掉一些数据并进行测试。

    从数据开始:

    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
    

    【讨论】:

    • 感谢您帮助我。我意识到 S 和 P 实际上是配对的。例如。第 1 行中的值与第 4、2 和 5、3 和 6 行中的值是一对。对于混淆我真的很抱歉。我想测试这些对何时相同。我实际上已经得到了初始表,用一个单独的“组”列来表示它。我已经改变了我的问题以正确反映这一点。再次抱歉。
    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2021-10-15
    • 2020-06-25
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多