首页 > 解决方案 > 获取网络R中的友谊时间长度

问题描述

我有一个超过 7 波的青少年友谊网络数据集。我正在尝试获取给定二元组(定向友谊)的长度。

样本数据:

 ego    alter   wave
   1        5      1
   1        4      1
   1        5      2
   1        2      2
   1        3      2
   2        8      1
   2        8      2
   2        8      3
   3        4      1
   3        7      1
   3        6      1
   3        6      2
   3        7      3
   3        6      3

想要的数据:

 ego    alter   friendship_length
   1        5     2  
   1        4     1 
   1        2     1 
   1        3     1  
   2        8     3        
   3        4     1 
   3        7     1 
   3        6     3    

这是我已经尝试过的:

edges_wide <- edges_long %>% 
              select(ego, alter, wave) %>%
              group_by(ego, alter) %>% 
              mutate(col=seq_along(ego))%>% # add a column indicator
              spread(key=col, value=wave)

这给了我这个:

 ego    alter   col3    col4    col5
   1        5      1       2      NA
   1        4      1      NA      NA                    
   1        2      2      NA      NA
   1        3      2      NA      NA
   2        8      1       2       3            
   3        4      1      NA      NA
   3        7      1       3      NA
   3        6      1       2       3

从这里我不确定如何获得定向友谊的波跨度(长度),包括不计算非连续提名(如 ego 3 alter 7)。

标签: rdplyrtidyverseigraphdata-manipulation

解决方案


应该有可能有一个更短的解决方案。

如果我理解正确,您只想计算alter 和ego 有关系的后续波的第一次出现。因此,我们可以添加一个组 id row_number(),针对有时波在 1 之后开始的事实进行调整min(wave)-1,然后只计算wave与修改后的id一致的观察值。对于给定的一对,一旦数据中跳过一个波,两个索引就会不同。

d %>% 
  arrange(wave) %>% 
  group_by(ego, alter) %>%
  mutate(id = row_number() + min(wave) - 1) %>%
  summarise(friendship_lenght = sum(wave==id))

# A tibble: 8 x 3
# Groups:   ego [3]
    ego alter friendship_lenght
  <int> <int>             <int>
1     1     2                 1
2     1     3                 1
3     1     4                 1
4     1     5                 2
5     2     8                 3
6     3     4                 1
7     3     6                 3
8     3     7                 1

编辑 解决新评论。我们要计算连续友谊关系的最长持续时间。row_number()可用于成对创建唯一的友谊阶段 ID。第一个连续波中的友谊都将被赋予相同的整数,对于所有后续连续的友谊,依此类推。因此,我们可以计算每个整数出现的次数,并取最大值:

dd %>% 
  arrange(wave) %>% 
  group_by(ego, alter) %>%
  count(wave - row_number() ) %>% 
  summarise(friendship_lenght = max(n)) 

# A tibble: 9 x 3
# Groups:   ego [3]
    ego alter friendship_lenght
  <int> <int>             <dbl>
1     1     2                 1
2     1     3                 1
3     1     4                 1
4     1     5                 2
5     2     8                 3
6     3     4                 1
7     3     6                 3
8     3     7                 1
9     3     8                 3

数据

library(dplyr)
d <-  read.table(text = "
             ego    alter   wave
   1        5      1
   1        4      1
                 1        5      2
                 1        2      2
                 1        3      2
                 2        8      1
                 2        8      2
                 2        8      3
                 3        4      1
                 3        7      1
                 3        6      1
                 3        6      2
                 3        7      3
                 3        6      3", header=T)


dd <-  read.table(text = "
                 ego    alter   wave
                 1        5      1
                 1        4      1
                 1        5      2
                 1        2      2
                 1        3      2
                 2        8      1
                 2        8      2
                 2        8      3
                 3        4      1
                 3        7      1
                 3        6      1
                 3        6      2
                 3        7      3
                 3        6      3
                 3 8 2
                 3 8 3
                 3 8 8
                 3 8 6
                 3 8 7", header=T)

推荐阅读