来自长格式的成对计数数据
Pairwise count data from long format
示例数据
我有以下数据:
df <- data.frame(
id = c('X1','X1','X1','X1','X2','X2','X2','X2'),
pos = c(1,2,3,4,1,2,3,4),
group = c(100,200,100,300,100,200,100,200)
)
因此看起来像:
id pos group
1 X1 1 100
2 X1 2 200
3 X1 3 100
4 X1 4 300
5 X2 1 100
6 X2 2 200
7 X2 3 100
8 X2 4 200
我努力实现的目标
我想使用 geom_segment()
绘制此数据,其中 pos
位于 x 轴上,group
位于 y 轴上。然后对于这些段中的每一个,我想计算它们在数据集中出现的频率(基于 id
列)。对示例数据集执行此操作时,结果将是:
pos1 pos2 group1 group2 id.count
1 2 100 200 2
2 3 200 100 2
3 4 100 300 1
3 4 100 200 1
我不知道如何开始,虽然我熟悉 dplyr 的 group_by
,但我不知道如何构建最初的四列。
我尝试了以下有效的方法,但想知道是否有更优雅的解决方案:
# Simple stats
vals <- unique(df$pos)
min.val = min(vals)
max.val = max(vals)
# Combination
comb.df <- data.frame(
pos1 = min.val:(max.val - 1),
pos2 = (min.val + 1): max.val
)
# Combine
comb.df <- comb.df %>%
left_join(df %>% select(pos1 = pos, group1 = group, id )) %>%
left_join(df %>% select(pos2 = pos, group2 = group, id ))
# Count
comb.df <- comb.df %>%
group_by(pos1, pos2, group1, group2) %>%
summarise(n.ids = n_distinct(id))
如果您的数据集中的顺序与示例中的一样,您可以试试这个:
library(dplyr)
df %>% group_by(id) %>%
transmute(pos1 = pos, pos2 = lead(pos),
group1 = group, group2 = lead(group)) %>%
na.omit() %>% ungroup()%>%
count(pos1, pos2, group1, group2, name = "id.count")
# A tibble: 4 x 5
# pos1 pos2 group1 group2 id.count
# <dbl> <dbl> <dbl> <dbl> <int>
# 1 2 100 200 2
# 2 3 200 100 2
# 3 4 100 200 1
# 3 4 100 300 1
示例数据
我有以下数据:
df <- data.frame(
id = c('X1','X1','X1','X1','X2','X2','X2','X2'),
pos = c(1,2,3,4,1,2,3,4),
group = c(100,200,100,300,100,200,100,200)
)
因此看起来像:
id pos group
1 X1 1 100
2 X1 2 200
3 X1 3 100
4 X1 4 300
5 X2 1 100
6 X2 2 200
7 X2 3 100
8 X2 4 200
我努力实现的目标
我想使用 geom_segment()
绘制此数据,其中 pos
位于 x 轴上,group
位于 y 轴上。然后对于这些段中的每一个,我想计算它们在数据集中出现的频率(基于 id
列)。对示例数据集执行此操作时,结果将是:
pos1 pos2 group1 group2 id.count
1 2 100 200 2
2 3 200 100 2
3 4 100 300 1
3 4 100 200 1
我不知道如何开始,虽然我熟悉 dplyr 的 group_by
,但我不知道如何构建最初的四列。
我尝试了以下有效的方法,但想知道是否有更优雅的解决方案:
# Simple stats
vals <- unique(df$pos)
min.val = min(vals)
max.val = max(vals)
# Combination
comb.df <- data.frame(
pos1 = min.val:(max.val - 1),
pos2 = (min.val + 1): max.val
)
# Combine
comb.df <- comb.df %>%
left_join(df %>% select(pos1 = pos, group1 = group, id )) %>%
left_join(df %>% select(pos2 = pos, group2 = group, id ))
# Count
comb.df <- comb.df %>%
group_by(pos1, pos2, group1, group2) %>%
summarise(n.ids = n_distinct(id))
如果您的数据集中的顺序与示例中的一样,您可以试试这个:
library(dplyr)
df %>% group_by(id) %>%
transmute(pos1 = pos, pos2 = lead(pos),
group1 = group, group2 = lead(group)) %>%
na.omit() %>% ungroup()%>%
count(pos1, pos2, group1, group2, name = "id.count")
# A tibble: 4 x 5
# pos1 pos2 group1 group2 id.count
# <dbl> <dbl> <dbl> <dbl> <int>
# 1 2 100 200 2
# 2 3 200 100 2
# 3 4 100 200 1
# 3 4 100 300 1