在R语言中转换含组合数据与条件的DataFrame的方法问询
解决R语言中按Patent分组生成Class两两组合的问题
嗨,我来帮你搞定这个DataFrame的转换需求!你已经完成了单个Patent的处理,现在只需要借助分组操作就能自动遍历所有Patent,不用手动写循环啦。
首先,先把你的原始数据整理成更规范的数据框(比用matrix更方便后续操作):
library(dplyr) # 创建原始数据框 df <- tibble( Patent = c("x1", "x1", "x1", "x2", "x2"), Class = c("A", "B", "C", "A", "B") )
接下来,用dplyr的分组功能结合combn,就能自动对每个Patent组生成Class的两两组合:
# 核心转换代码 result <- df %>% group_by(Patent) %>% group_modify(~ { # 生成当前组Class的所有2元素组合(返回列表格式) class_pairs <- combn(.x$Class, 2, simplify = FALSE) # 将组合列表拆分为Class1和Class2列 tibble( Class1 = sapply(class_pairs, `[`, 1), Class2 = sapply(class_pairs, `[`, 2) ) }) %>% ungroup() # 取消分组,得到最终结果
运行后查看结果,完全符合你的预期:
print(result) #> # A tibble: 4 × 3 #> Patent Class1 Class2 #> <chr> <chr> <chr> #> 1 x1 A B #> 2 x1 A C #> 3 x1 B C #> 4 x2 A B
代码简单解释:
group_by(Patent):按专利号分组,确保每个Patent的Class单独处理group_modify:对每个分组执行自定义逻辑,.x代表当前分组的子数据框combn(.x$Class, 2, simplify = FALSE):生成Class列的所有两两组合,simplify=FALSE让结果以列表返回,方便后续拆分sapply(class_pairs,[, 1):从每个组合列表中提取第一个元素作为Class1,同理提取第二个元素作为Class2ungroup():取消分组,让结果回到普通数据框格式
如果你习惯用tidyr的unnest,也可以用这种写法,效果完全一致:
library(tidyr) result <- df %>% group_by(Patent) %>% summarize(class_pairs = list(combn(Class, 2, simplify = FALSE))) %>% unnest(class_pairs) %>% mutate( Class1 = map_chr(class_pairs, 1), Class2 = map_chr(class_pairs, 2) ) %>% select(Patent, Class1, Class2) %>% ungroup()
这样就不用手动写循环啦,tidyverse的分组操作会自动帮你处理所有Patent组~
内容的提问来源于stack exchange,提问作者Plantekös
相关产品推荐
相关产品推荐

