R-选择具有最大计数的行

时间:2018-07-23 14:15:41

标签: r

我有如下数据:

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行),所以花费的时间太长。我该怎么办?

1 个答案:

答案 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

请注意:

  1. 要使其正常工作,您的变量需要像 data:部分中那样命名:
  2. 更改chosen_sname以查看其他名称组合!
  3. 您的示例包含一个错误。对于“ a,d,e”,其值为9。