我有一个带有subject ID的数据集,我根据不同的标准(“度量”)进行每小时的测量。这些指标中的每一个都符合或不符合法规要求(1表示是,0表示不符合)。我有两个目标:
任务
(1)决定“完全遵从”,即某学科每小时的每量度均有1度。如果有一个零,主体不能满足“完全遵守”。
(2)决定每一学科的遵从百分率。也就是说,如果一个被试有3/4小时的所有1小时,那么他们是75%的顺应性。
我想使用dplyr和filter()组合或一些我可能不熟悉的聚合函数来解决这个问题。
示例
下面是一个示例数据集:
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)点:
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,我能够通过以下方法获得浓缩的百分比:
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 发布于 2019-07-29 16:26:33
这个答案有点冗长,但是逻辑应该足够容易跟踪--每个遵从列1之和,计算遵从率,删除三个遵从性列上的遵从性<100%的主题。然后从原始数据中筛选出这些主题。
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发布于 2019-07-29 16:27:17
一种可能是:
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如果您想要百分比,那么您可以:
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所建议的):
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 https://stackoverflow.com/questions/57257618
复制相似问题