0

所以我正在为基于 IMDb 数据的社交网络分析创建一个边缘文件。我遇到了一个问题,我不知道如何解决它,因为我是 R 新手。

假设我有以下数据框:

movieID <- c('A', 'A','A', 'B','B', 'C','C', 'C')
crewID <- c('Z', 'Y', 'X', 'Z','V','V', 'X', 'Y')
rating <- c('7.3','7.3', '7.3', '2.1', '2.1', '9.0','9.0', '9.0')
df <- data.frame(movieID, crewID, rating)
电影ID 船员编号 评分
一个 Z 7.3
一个 7.3
一个 X 7.3
Z 2.1
2.1
C 9.0
C X 9.0
C 9.0

我正在尝试在电影中构建独特的 CrewID 对,其权重等于该对的出现次数,这意味着这两个工作人员一起制作电影的频率。所以基本上我想要一个像下面这样的数据框:

船员 ID1 船员 ID2 重量 (不是col,而是解释)
Z 1 在电影A中在一起过一次
Z X 1 在电影A中在一起过一次
X 2 在电影 A 和 C 中在一起两次
Z 1 在电影B中在一起过一次
X 1 在电影C中在一起过一次
1 在电影C中在一起过一次

对 (Z,Y) 和 (Y,Z) 彼此相等,因为我不关心方向。

我在类似的问题上找到了以下 StackOverflow 线程: 如何根据 R 中的出现顺序从单个列创建对?

但是在我的情况下,这会跳过 (V,Y) 和 (X,Z) 的组合,并且 (X,Y) 的计数仍然是 1,我不知道如何修复它。

4

2 回答 2

2
m <- crossprod(table(df[-3]))
m[upper.tri(m, diag = TRUE)] <-0
subset(as.data.frame.table(m), Freq > 0)

   CrewID CrewID.1 Freq
2       X        V    1
3       Y        V    1
4       Z        V    1
7       Y        X    2
8       Z        X    1
12      Z        Y    1
于 2021-11-15T22:05:23.307 回答
0

也许不是最有效的解决方案,但这将是一种方法:

# Define a function that generates pairs of ids
make_pairs <- function(data){
# Extract all ids in the movie
data$crew %>% 
    # Organize them alphabetically
    sort() %>% 
    # Generate all unique pairs
    combn(2) %>% 
    # Prep for map
    as.data.frame() %>% 
    # Generate pairs as single string
    purrr::map_chr(str_flatten, '_')
}
# Generate the data
tibble::tibble(
movie = c('A', 'A', 'A', 'B','B', "C", 'C', 'C'),
crew = c('Z', 'Y', 'X', 'Z', 'V', 'V', 'X', 'Y')
) %>% 
    # Nest the data so all ids in one movie gets put together
    tidyr::nest(data = -movie) %>%
    # Generate pairs of interactions
        dplyr::mutate(
        pairs = purrr::map(data, make_pairs)
    ) %>% 
    # Expand all pairs
    tidyr::unnest(cols = pairs) %>% 
    # Separate them into unique colums
    tidyr::separate(pairs, c('id1', 'id2')) %>% 
    # Count the number of times two ids co-occure
    dplyr::count(id1, id2)

# A tibble: 6 x 3
  id1   id2       n
  <chr> <chr> <int>
1 V     X         1
2 V     Y         1
3 V     Z         1
4 X     Y         2
5 X     Z         1
6 Y     Z         1
于 2021-11-15T22:06:50.443 回答