通过第二个因素变量的组合总结一个因素变量
Summarize a factor variable by combinations of second factor variable
我的数据是这样的
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)
)
我将 Encounter 变量视为一个因素。
我想知道可能的 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 设置单独的变量,然后尝试计算每个组合的实例,但我没有正确执行此操作,如图所示以下。在数数之前,我不知道如何通过 encounter "group"。
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')]
但我并没有得到我所希望的总结。请帮忙。谢谢
这是第一个问题的答案:
> 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
如果要按EffortType
排序,请在末尾添加一个%>% arrange(EffortType)
。
我会为遭遇属性做一个单独的table:
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)]
如果您非常喜欢使用单个 table,不过...
# 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"]
我的数据是这样的
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)
)
我将 Encounter 变量视为一个因素。
我想知道可能的 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 设置单独的变量,然后尝试计算每个组合的实例,但我没有正确执行此操作,如图所示以下。在数数之前,我不知道如何通过 encounter "group"。
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')]
但我并没有得到我所希望的总结。请帮忙。谢谢
这是第一个问题的答案:
> 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
如果要按EffortType
排序,请在末尾添加一个%>% arrange(EffortType)
。
我会为遭遇属性做一个单独的table:
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)]
如果您非常喜欢使用单个 table,不过...
# 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"]