我的数据看起来像这样
set.seed(89)
d <- data.frame(
ID=seq(1, 100),
Encounter=sample(c(1:50), 100, replace = TRUE),
EffortType=sample(c("A","B","C"), 100, replace = TRUE)
)
我认为遇到变量是一个因素。
我想知道EffortType可能组合的频率。
我希望结果看起来像这样
EffortType N
A 8
B 8
C 9
A,B 4
A,C 8
B,C 5
A,B,C 3
然后,我还希望能够通过EffortType组合来对数据进行子集化。例如,我最终得到的EffortType A,B的子集看起来像这样
ID Encounter EffortType
52 2 A
53 2 B
61 2 A
63 2 A
79 2 A
36 7 B
59 7 B
83 7 A
etc.
我确实尝试重塑数据,以便使用“ mutate”对EffortType的每个级别使用单独的变量,然后尝试计算每个组合的实例,但未正确执行此操作,如下所示。在进行计数之前,我不知道如何通过相遇进行“分组”。
d = mutate(d,
A = ifelse(grepl("A", EffortType), T, F),
B = ifelse(grepl("B", EffortType), T, F),
C = ifelse(grepl("C", EffortType), T, F))
d = data.table(d)
d[, .N, by = c('Encounter', 'A', 'B', 'C')]
但是我并没有得到我希望的摘要。请帮忙。谢谢。
答案 0 :(得分:2)
以下是您第一个问题的答案:
> library(tidyverse)
> d %>% arrange(Encounter) %>%
group_by(Encounter) %>%
distinct(EffortType) %>%
arrange(EffortType) %>%
summarize(Efforts=paste(EffortType,collapse=",")) %>%
group_by(Efforts) %>% tally()
# A tibble: 7 x 2
Efforts n
<chr> <int>
1 A 6
2 A,B 7
3 A,B,C 6
4 A,C 9
5 B 6
6 B,C 5
7 C 4
如果您将以上对d
的处理保存为名为z
的数据框,则可以基于每个工作量组合来对数据进行子集处理,例如A
中B
和z$Efforts[2]
的组合:
> d %>% filter(EffortType %in% unlist(strsplit(z$Efforts[2],split=",")))
ID Encounter EffortType
1 1 43 B
2 2 15 B
3 3 8 B
4 4 36 A
5 6 2 B
6 7 50 A
如果要按%>% arrange(EffortType)
排序,请在末尾添加EffortType
。
答案 1 :(得分:1)
我将为遇到的属性创建一个单独的表:
library(data.table)
EncounterDT = d[,
.(tt = paste(sort(unique(EffortType)), collapse=" "))
, keyby=Encounter]
# count encounters by types
EncounterDT[, .N, keyby=tt][order(nchar(tt), tt)]
# subset d using a join
d[EncounterDT[tt == "A B", .(Encounter)], on=.(Encounter)]
但是,如果您强烈希望使用单个表,那么...
# add a repeating-value column
d[, tt := paste(sort(unique(EffortType)), collapse=" "), by=Encounter]
# count encounters by types
d[, uniqueN(Encounter), keyby=tt][order(nchar(tt), tt)]
# subset d based using the tt column
d[tt == "A B"]