首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于组和列的有条件聚合r dplyr

基于组和列的有条件聚合r dplyr
EN

Stack Overflow用户
提问于 2019-07-29 16:07:30
回答 2查看 160关注 0票数 0

我有一个带有subject ID的数据集,我根据不同的标准(“度量”)进行每小时的测量。这些指标中的每一个都符合或不符合法规要求(1表示是,0表示不符合)。我有两个目标:

任务

(1)决定“完全遵从”,即某学科每小时的每量度均有1度。如果有一个零,主体不能满足“完全遵守”。

(2)决定每一学科的遵从百分率。也就是说,如果一个被试有3/4小时的所有1小时,那么他们是75%的顺应性。

我想使用dplyrfilter()组合或一些我可能不熟悉的聚合函数来解决这个问题。

示例

下面是一个示例数据集:

代码语言:javascript
复制
df <- data.frame(
  "Subject ID" = c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"),
  "Metric 1" = rep("value", 12),
  "Compliance 1" = rep(1, 12),
  "Metric 2" = rep("value", 12),
  "Compliance 2" = c(1,1,1,1,1,0,1,1,1,1,1,1),
  "Metric 3" = rep("value", 12),
  "Compliance 3" = c(1,1,1,1,0,1,1,1,1,1,1,1)
)

以下是我想用dplyr实现的(1)点:

代码语言:javascript
复制
df2 <- data.frame(
  "Subject ID" = c("A", "A", "A", "A", "C", "C", "C", "C"),
  "Metric 1" = rep("value", 8),
  "Compliance 1" = rep(1, 8),
  "Metric 2" = rep("value", 8),
  "Compliance 2" = rep(1, 8),
  "Metric 3" = rep("value", 8),
  "Compliance 3" = rep(1, 8)
)

因为(2)我想以一种方式将数据进行汇总,以表明(A)主体(A)有100%的依从性,而(B)有50%的遵从性。

编辑的答案

多亏了tmfmnk,我能够通过以下方法获得浓缩的百分比:

代码语言:javascript
复制
df %>%
  mutate(cond = rowMeans(select(., starts_with("Compliance"))) == 1) %>%
  group_by(Subject.ID) %>% 
  tally(cond) %>% 
  mutate(perc = n/4)

  Subject.ID     n  perc
  <fct>      <int> <dbl>
1 A              4   1  
2 B              2   0.5
3 C              4   1  
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-29 16:26:33

这个答案有点冗长,但是逻辑应该足够容易跟踪--每个遵从列1之和,计算遵从率,删除三个遵从性列上的遵从性<100%的主题。然后从原始数据中筛选出这些主题。

代码语言:javascript
复制
compliant <- df %>% select(Subject.ID,matches('Compliance')) %>% 
  gather(k,v,-Subject.ID) %>% 
  group_by(Subject.ID,k) %>% 
  summarise(sum=sum(v),n=n()) %>% 
  group_by(Subject.ID,k) %>%
  mutate(perc=sum/sum(n)) %>% 
  group_by(Subject.ID) %>% summarise(c=sum(perc)) %>% 
  filter(c==3)

# A tibble: 2 x 2
  Subject.ID     c
  <fct>      <dbl>
1 A              3
2 C              3

df %>% filter(Subject.ID %in% compliant$Subject.ID)

  Subject.ID Metric.1 Compliance.1 Metric.2 Compliance.2 Metric.3 Compliance.3
1          A    value            1    value            1    value            1
2          A    value            1    value            1    value            1
3          A    value            1    value            1    value            1
4          A    value            1    value            1    value            1
5          C    value            1    value            1    value            1
6          C    value            1    value            1    value            1
7          C    value            1    value            1    value            1
8          C    value            1    value            1    value            1
票数 1
EN

Stack Overflow用户

发布于 2019-07-29 16:27:17

一种可能是:

代码语言:javascript
复制
df %>%
 mutate(cond = rowMeans(select(., starts_with("Compliance"))) == 1) %>%
 group_by(Subject.ID) %>%
 filter(all(cond)) %>%
 select(-cond)

      Subject.ID Metric.1 Compliance.1 Metric.2 Compliance.2 Metric.3 Compliance.3
    1          A    value            1    value            1    value            1
    2          A    value            1    value            1    value            1
    3          A    value            1    value            1    value            1
    4          A    value            1    value            1    value            1
    5          C    value            1    value            1    value            1
    6          C    value            1    value            1    value            1
    7          C    value            1    value            1    value            1
    8          C    value            1    value            1    value            1

如果您想要百分比,那么您可以:

代码语言:javascript
复制
df %>%
 mutate(cond = rowMeans(select(., starts_with("Compliance")))) 

   Subject.ID Metric.1 Compliance.1 Metric.2 Compliance.2 Metric.3 Compliance.3      cond
1           A    value            1    value            1    value            1 1.0000000
2           A    value            1    value            1    value            1 1.0000000
3           A    value            1    value            1    value            1 1.0000000
4           A    value            1    value            1    value            1 1.0000000
5           B    value            1    value            1    value            0 0.6666667
6           B    value            1    value            0    value            1 0.6666667
7           B    value            1    value            1    value            1 1.0000000
8           B    value            1    value            1    value            1 1.0000000
9           C    value            1    value            1    value            1 1.0000000
10          C    value            1    value            1    value            1 1.0000000
11          C    value            1    value            1    value            1 1.0000000
12          C    value            1    value            1    value            1 1.0000000

要获得每个组符合条件的百分比(如@rsh52 52所建议的):

代码语言:javascript
复制
df %>%
 mutate(cond = rowMeans(select(., starts_with("Compliance"))) == 1) %>%
 group_by(Subject.ID) %>% 
 tally(cond) %>% 
 mutate(perc = n/4)

  Subject.ID     n  perc
  <fct>      <int> <dbl>
1 A              4   1  
2 B              2   0.5
3 C              4   1  
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57257618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档