查找字符串重复的次数和列数

时间:2016-02-28 19:24:31

标签: r string data.table matching

我的数据每个元素包含6个字符串。它有6个字符的字符串。数据也有空格。 我想知道在所有列中重复每个字符串的次数

例如P67809在a栏和d栏中重复2次 所以输出应该看起来像

string   No     columns 
P67809   2       a,b 

基于此功能,我可以为每个字符串分配一个行号

normalize <- function(x, delim) {
    x <- gsub(")", "", x, fixed=TRUE)
    x <- gsub("(", "", x, fixed=TRUE)
    idx <- rep(seq_len(length(x)), times=nchar(gsub(sprintf("[^%s]",delim), "", as.character(x)))+1)
    names <- unlist(strsplit(as.character(x), delim))
    return(setNames(idx, names))
}

然后我在所有和每个列字符串上应用该函数,如

myS <- lapply(mydata, normalize,";") 

但我不知道如何搜索并获得输出

3 个答案:

答案 0 :(得分:2)

我们可以melt来自&#39;范围内的数据。长期&#39;格式。拆分&#39;值&#39; ;列,以获得list输出。我们将list的名称设置为&#39;变量&#39; &#39; dM&#39;列。然后stack list到两列输出,并使用&#39; tbl&#39;获取频率计数。可能更容易理解来自“tbl”的结果。输出

library(reshape2)
dM <- melt(mydata, id.var=NULL) 
lst1 <- setNames(strsplit(dM$value, ";"), dM$variable)
tbl <- table(stack(lst1)[2:1])
tbl
values
#ind   A4QPH2 O60814 P0CG47 P0CG48 P14923 P15924 P19338 P35908 P42356 P57053 P58876 P62750 P62807 P62851 P62979 P63241 P67809 Q02413 Q06830 Q07955 Q16658 Q5QNW6 Q6IS14 Q8N8J0 Q93079 Q969S3
#  a 0      1      0      0      0      1      1      1      1      1      0      0      0      0      0      0      0      1      0      0      0      0      0      0      1      0      0
#  b 3      0      0      1      1      0      0      0      0      0      0      0      0      0      0      1      1      0      1      0      0      0      0      1      0      0      0
#  c 1      0      0      1      1      0      0      0      0      0      0      0      0      0      1      1      1      0      1      0      0      1      0      1      0      0      0
#  d 0      0      1      1      1      0      0      0      0      0      1      1      1      1      0      1      0      1      0      1      1      0      1      0      0      1      1
#   values
#ind Q99877 Q99879 Q9Y2T7
#  a      0      0      1
#  b      0      0      0
#  c      0      0      0
#  d      1      1      1

我们使用colSums获取每个元素的总数。

cS <- colSums(tbl)

如果我们需要在OP的帖子中获得输出,我们可以melt list输出来创建2列data.frame。从此,我们转换为&#39; data.table&#39; (setDT(),按&#39;值&#39;分组在列中,我们获得了lengthunique元素的变量&#39;以及paste元素unique。{/ p>

library(data.table)
res <- setDT(melt(lst1))[, list(No= uniqueN(L1),
      columns= toString(unique(L1))) ,.(string=value)]
head(res,2)
#    string No columns
#1: P67809  2    a, d
#2: Q9Y2T7  2    a, d

答案 1 :(得分:1)

一种方法可能是:

res <- apply(mydata, 2, function(x) unlist(strsplit(x, ";")))
un <- unique(unlist(res))
res2 <- sapply(un, function(x) lapply(res, function(y) as.numeric(x %in% y)))

res2

  P67809 Q9Y2T7 P42356 Q8N8J0 A4QPH2 P35908 P19338 P15924 P14923 Q02413 P63241 Q6IS14
a 1      1      1      1      1      1      1      1      1      0      0      0     
b 0      0      0      0      0      0      0      0      0      1      1      1     
c 0      0      0      0      0      0      0      0      0      1      1      1     
d 1      1      0      0      0      0      0      0      0      0      0      0     
  P62979 P0CG47 P0CG48   Q16658 P62851 Q07955 Q06830 P62807 O60814 P57053 Q99879 Q99877
a 0      0      0      0 0      0      0      0      0      0      0      0      0     
b 1      1      1      1 0      0      0      0      0      0      0      0      0     
c 1      1      1      1 1      1      0      0      0      0      0      0      0     
d 1      1      1      0 0      0      1      1      1      1      1      1      1     
  Q93079 Q5QNW6 P58876 P62750 Q969S3
a 0      0      0      0      0     
b 0      0      0      0      0     
c 0      0      0      0      0     
d 1      1      1      1      1   

as.data.frame(t(apply(t(res2), 1, function(x) cbind(sum(as.numeric(x)), paste(names(x)[which(as.logical(x))], collapse = ",")))))
       V1    V2
P67809  2   a,d
Q9Y2T7  2   a,d
P42356  1     a
Q8N8J0  1     a
A4QPH2  1     a
P35908  1     a
P19338  1     a
P15924  1     a
P14923  1     a
Q02413  2   b,c
P63241  2   b,c
Q6IS14  2   b,c
P62979  3 b,c,d
P0CG47  3 b,c,d
P0CG48  3 b,c,d
        2   b,c
Q16658  1     c
P62851  1     c
Q07955  1     d
Q06830  1     d
P62807  1     d
O60814  1     d
P57053  1     d
Q99879  1     d
Q99877  1     d
Q93079  1     d
Q5QNW6  1     d
P58876  1     d
P62750  1     d
Q969S3  1     d

答案 2 :(得分:1)

来自splitstackshape的{​​{1}}和来自gather的{​​{1}}的替代方法。

tidyr