为无序对生成唯一的 dyad 标识符
Generate unique dyad identifiers for unorder pairs
我正在处理的数据帧以二元格式编码,其中每个观察(即行)包含一个源节点(from
)和一个目标节点(to
)以及其他一些二元协变量(例如二元相关,corr
)。
为了简单起见,我想将每个二元体视为无序的并为每个二元体生成一个唯一标识符,就像下面的那个(即df1
):
# original data
df <- data.frame(
from = c("A", "A", "A", "B", "C", "A", "D", "E", "F", "B"),
to = c("B", "C", "D", "C", "B", "B", "A", "A", "A", "A"),
corr = c(0.5, 0.7, 0.2, 0.15, 0.15, 0.5, 0.2, 0.45, 0.54, 0.5))
from to corr
1 A B 0.50
2 A C 0.70
3 A D 0.20
4 B C 0.15
5 C B 0.15
6 A B 0.50
7 D A 0.20
8 E A 0.45
9 F A 0.54
10 B A 0.50
# desired format
df1 <- data.frame(
from = c("A", "A", "A", "B", "C", "A", "D", "E", "F", "B"),
to = c("B", "C", "D", "C", "B", "B", "A", "A", "A", "A"),
corr = c(0.5, 0.7, 0.2, 0.15, 0.15, 0.5, 0.2, 0.45, 0.54, 0.5),
dyad = c(1, 2, 3, 4, 4, 1, 3, 5, 6, 1))
from to corr dyad
1 A B 0.50 1
2 A C 0.70 2
3 A D 0.20 3
4 B C 0.15 4
5 C B 0.15 4
6 A B 0.50 1
7 D A 0.20 3
8 E A 0.45 5
9 F A 0.54 6
10 B A 0.50 1
其中 dyad A-B/B-A、A-D/D-A 被视为相同的对并分配有相同的 dyad 标识符。
虽然从原始数据中提取无序对列表很容易,但很难将它们映射到原始数据帧以生成无序二元标识符。谁能对此提供一些见解?
一个dplyr
选项可以是:
df %>%
mutate(dyad = group_indices(., paste0(pmax(from, to), pmin(from, to))))
from to corr dyad
1 A B 0.50 1
2 A C 0.70 2
3 A D 0.20 4
4 B C 0.15 3
5 C B 0.15 3
6 A B 0.50 1
7 D A 0.20 4
8 E A 0.45 5
9 F A 0.54 6
10 B A 0.50 1
或者:
df %>%
mutate(dyad = dense_rank(paste0(pmax(from, to), pmin(from, to))))
但是,如果您需要按特定顺序分配标识符(这意味着标识符本身包含一些信息),那么@Ronak Shah 的解决方案可能更适合您。
使用apply
的一种方法是将sort
和paste
两列中的值转换为factor
然后integer
得到每个组合的唯一编号。
df$temp <- apply(df[1:2], 1, function(x) paste(sort(x), collapse = "_"))
df$dyad <- as.integer(factor(df$temp, levels = unique(df$temp)))
df$temp <- NULL
df
# from to corr dyad
#1 A B 0.50 1
#2 A C 0.70 2
#3 A D 0.20 3
#4 B C 0.15 4
#5 C B 0.15 4
#6 A B 0.50 1
#7 D A 0.20 3
#8 E A 0.45 5
#9 F A 0.54 6
#10 B A 0.50 1
我正在处理的数据帧以二元格式编码,其中每个观察(即行)包含一个源节点(from
)和一个目标节点(to
)以及其他一些二元协变量(例如二元相关,corr
)。
为了简单起见,我想将每个二元体视为无序的并为每个二元体生成一个唯一标识符,就像下面的那个(即df1
):
# original data
df <- data.frame(
from = c("A", "A", "A", "B", "C", "A", "D", "E", "F", "B"),
to = c("B", "C", "D", "C", "B", "B", "A", "A", "A", "A"),
corr = c(0.5, 0.7, 0.2, 0.15, 0.15, 0.5, 0.2, 0.45, 0.54, 0.5))
from to corr
1 A B 0.50
2 A C 0.70
3 A D 0.20
4 B C 0.15
5 C B 0.15
6 A B 0.50
7 D A 0.20
8 E A 0.45
9 F A 0.54
10 B A 0.50
# desired format
df1 <- data.frame(
from = c("A", "A", "A", "B", "C", "A", "D", "E", "F", "B"),
to = c("B", "C", "D", "C", "B", "B", "A", "A", "A", "A"),
corr = c(0.5, 0.7, 0.2, 0.15, 0.15, 0.5, 0.2, 0.45, 0.54, 0.5),
dyad = c(1, 2, 3, 4, 4, 1, 3, 5, 6, 1))
from to corr dyad
1 A B 0.50 1
2 A C 0.70 2
3 A D 0.20 3
4 B C 0.15 4
5 C B 0.15 4
6 A B 0.50 1
7 D A 0.20 3
8 E A 0.45 5
9 F A 0.54 6
10 B A 0.50 1
其中 dyad A-B/B-A、A-D/D-A 被视为相同的对并分配有相同的 dyad 标识符。 虽然从原始数据中提取无序对列表很容易,但很难将它们映射到原始数据帧以生成无序二元标识符。谁能对此提供一些见解?
一个dplyr
选项可以是:
df %>%
mutate(dyad = group_indices(., paste0(pmax(from, to), pmin(from, to))))
from to corr dyad
1 A B 0.50 1
2 A C 0.70 2
3 A D 0.20 4
4 B C 0.15 3
5 C B 0.15 3
6 A B 0.50 1
7 D A 0.20 4
8 E A 0.45 5
9 F A 0.54 6
10 B A 0.50 1
或者:
df %>%
mutate(dyad = dense_rank(paste0(pmax(from, to), pmin(from, to))))
但是,如果您需要按特定顺序分配标识符(这意味着标识符本身包含一些信息),那么@Ronak Shah 的解决方案可能更适合您。
使用apply
的一种方法是将sort
和paste
两列中的值转换为factor
然后integer
得到每个组合的唯一编号。
df$temp <- apply(df[1:2], 1, function(x) paste(sort(x), collapse = "_"))
df$dyad <- as.integer(factor(df$temp, levels = unique(df$temp)))
df$temp <- NULL
df
# from to corr dyad
#1 A B 0.50 1
#2 A C 0.70 2
#3 A D 0.20 3
#4 B C 0.15 4
#5 C B 0.15 4
#6 A B 0.50 1
#7 D A 0.20 3
#8 E A 0.45 5
#9 F A 0.54 6
#10 B A 0.50 1