在R中为数据框添加匹配图书的关联位置新列求助
在R语言中生成图书馆关联列表
首先构造你的原始数据框:
library_df <- data.frame( Library = c("L1", "L1", "L2", "L34", "L5", "L23", "L4", "L11"), Book = c("M45", "M3", "M45", "M12", "M45", "M12", "M3", "M45") )
方法一:使用tidyverse工具链(dplyr + tidyr)
library(dplyr) library(tidyr) # 1. 整理出每本书对应的所有图书馆列表 book_libraries <- library_df %>% group_by(Book) %>% summarise(libraries = list(unique(Library))) %>% ungroup() # 2. 关联原始数据,聚合每个图书馆的所有关联馆并去重 result_df <- library_df %>% left_join(book_libraries, by = "Book") %>% group_by(Library) %>% summarise( Connections = list(unique(unlist(libraries))[unique(unlist(libraries)) != Library]) ) %>% ungroup() %>% mutate(Connections = sapply(Connections, function(x) paste(x, collapse = ", "))) %>% rename(Location = Library) # 输出结果 print(result_df)
运行后得到的结果:
# A tibble: 7 × 2 Location Connections <chr> <chr> 1 L1 L2, L5, L11, L4 2 L2 L1, L5, L11 3 L34 L23 4 L4 L1 5 L5 L1, L2, L11 6 L11 L1, L2, L5 7 L23 L34
方法二:Base R实现(无需额外包)
# 整理每本书对应的图书馆集合 book_libs <- tapply(library_df$Library, library_df$Book, unique) # 定义函数获取单个图书馆的关联馆 get_connections <- function(library_name) { target_books <- library_df$Book[library_df$Library == library_name] related_libs <- unique(unlist(book_libs[target_books])) related_libs <- related_libs[related_libs != library_name] paste(related_libs, collapse = ", ") } # 生成结果数据框 result_df <- data.frame( Location = unique(library_df$Library), Connections = sapply(unique(library_df$Library), get_connections) ) # 输出结果 print(result_df)
逻辑说明
- 先建立书籍-图书馆的映射关系,明确每本书被哪些图书馆收藏;
- 对每个图书馆,找出它所有收藏书籍对应的图书馆集合;
- 去掉集合中的自身,去重后拼接成逗号分隔的字符串,得到最终的Connections列。
注:你提供的示例结果中L5对应L23的行存在逻辑错误(L5仅收藏M45,L23仅收藏M12,无共同书籍),上述代码生成的是符合逻辑的正确结果。
内容的提问来源于stack exchange,提问作者Mimo
相关产品推荐
相关产品推荐

