【问题标题】:dplyr group_by logical valuesdplyr group_by 逻辑值
【发布时间】:2016-03-15 07:10:27
【问题描述】:

我试图用一些陈述来简化这一点。不知道该怎么做(或者如果我可以的话),但是任何可以让我靠近或尽可能少的步骤的人。我正在使用 dplyr 和 lubridate。我有一个名为 OutofRange 的数据库(示例);

OutOfRange %>% select(OutRange, TouchVPOC)  
Source: local data frame [341 x 2]

   OutRange TouchVPOC

  (lgl)     (lgl)  

1     FALSE      TRUE  
2     FALSE     FALSE  
3     FALSE      TRUE  
4     FALSE     FALSE  
5     FALSE      TRUE

OutOfRange %>% select(OutRange, TouchVPOC) %>% filter(OutRange == T) %>% tally  
Source: local data frame [1 x 1]

      n  (int)  
1    37

OutOfRange %>% select(OutRange, TouchVPOC) %>% filter(OutRange == T, TouchVPOC == T) %>% tally  
Source: local data frame [1 x 1]

      n  (int)  
1    15

15/37  
[1] 0.4054054

所以,如果可能的话,我正在寻找类似这样的最终结果,其中 CountofDataFrame 是所有行的计数;其中 OutRange 和 TouchVPOC 是 TRUE 值的计数;和 Pct = TouchVPOC/OutRange。

CountOfDataFrame OutRange   TouchVPOC    Pct
             341       37          15    .40

我确实意识到,我可能会问很多.. 我对此很陌生,欢迎提出任何建议。只是在寻找正确方向的基础或开始。

【问题讨论】:

标签: r dplyr


【解决方案1】:

我建议你先把数据整理成整齐的格式,然后使用 group_by/summarize/mutate 进行聚合和百分比计算,如下所示。

a <- data.frame(OutRange = c(TRUE, FALSE, FALSE, FALSE, FALSE), 
           TouchVPOC = c(TRUE, TRUE, TRUE, FALSE, FALSE))

> a
  OutRange TouchVPOC
1     TRUE      TRUE
2    FALSE      TRUE
3    FALSE      TRUE
4    FALSE     FALSE
5    FALSE     FALSE

library(tidyr)
a %>% 
  gather(type, value, OutRange:TouchVPOC) %>%
  group_by(type) %>%
  summarize(true_count = sum(value)) %>%
  mutate(total = sum(true_count), Pct = true_count / total)

Source: local data frame [2 x 4]

       type true_count total   Pct
      (chr)      (int) (int) (dbl)
1  OutRange          1     4  0.25
2 TouchVPOC          3     4  0.75

【讨论】:

  • 谢谢!没有意识到 tidyr 是这样工作的。为我打开新的大门。运行此程序后,我意识到我需要一个过滤数据的前置步骤。但是我能够在改变原始数据期间在表中添加列。换句话说,我没有过滤,而是改变了一个名为 OutRange_Touch 的新列;成功了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 2020-03-31
  • 2015-09-02
  • 2017-03-01
  • 1970-01-01
  • 2021-04-17
  • 2021-02-14
相关资源
最近更新 更多