我有如下数据:
surname name
a b,a,c,e
b a,b,c,d,f
c a,d,c,e
d a,c,e,f,j,k
e b,d,e,g
现在,我必须更改与最多名称关联的三个姓氏的子集(a,b,c或b,c,d等)。换句话说,如果我更改姓a,b和e,则得到6个名字(a,b,c,d,e,g),但是如果我更改ab和c,则仅得到四个名字。目的是通过选择相同的姓氏来获得尽可能多的名称。
输出应类似于以下内容(三胞胎中姓氏的所有可能组合):
chosen_surname number_of_explained_unique_names
a,b,c 6
a,c,d 8
a,d,e 9
有没有简单的方法可以做到这一点?我虽然要选择所有可能的姓氏组合,然后计算名字的数量,但是我的data.frame很大(大约1000行),所以花费的时间太长。我该怎么办?
答案 0 :(得分:0)
不确定这是否更快:
数据:(请在下一个问题中提供可复制的数据(请参阅dput()
)
df1<-data.frame(surname=letters[1:5],
name=c("b,a,c,e",
"a,b,c,d,f",
"a,d,c,e",
"a,c,e,f,j,k",
"b,d,e,g"),stringsAsFactors=F)
代码:
library(magrittr)
#chosen_sname=c("a,b,c","a,c,d","a,d,e")
chosen_sname=combn(df1$surname,3) %>% data.frame(.,stringsAsFactors=F) %>% sapply(function(x){paste0(x,collapse=",")}) %>% unname
namesList = df1$name %>% strsplit(",")
colsList = chosen_sname %>% strsplit(",") %>% lapply(function(x)match(x,df1$surname))
sapply(colsList,function(x){namesList[x] %>% unlist %>% unique %>% length}) %>% data.frame(chosen_sname,length=.,stringsAsFactors=F)
结果:
# chosen_sname length
#1 a,b,c 6
#2 a,b,d 8
#3 a,b,e 7
#4 a,c,d 8
#5 a,c,e 6
#6 a,d,e 9
#7 b,c,d 8
#8 b,c,e 7
#9 b,d,e 9
#10 c,d,e 9
请注意:
chosen_sname
以查看其他名称组合!