【问题标题】:Generate unique dyad identifiers for unorder pairs为无序对生成唯一的二元标识符
【发布时间】:2019-08-12 08:21:14
【问题描述】:

我正在处理的数据框以二元格式编码,其中每个观察(即行)包含一个源节点(from)和一个目标节点(to)以及其他一些二元协变量(例如二元相关性,corr)。

为简单起见,我想将每个 dyad 视为无序并为每个 dyad 生成一个唯一标识符,例如下面的那个(即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 标识符。 虽然从原始数据中提取无序对的列表很容易,但很难将它们映射到原始数据帧以生成无序的二元标识符。谁能提供一些关于这方面的见解?

【问题讨论】:

    标签: r dplyr unique pairwise


    【解决方案1】:

    一个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 的解决方案可能更适合您。

    【讨论】:

    • 非常感谢您澄清这一点,这真的很有帮助。
    【解决方案2】:

    使用apply 的一种方法可以是sortpaste 两列中的值,将它们转换为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
    

    【讨论】:

    • 非常感谢,您推荐的解决方案很有魅力!
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多