2016-03-03 82 views
2

我有这样伯爵出现并排除失踪

aa<-structure(c("AABB", "AABB", NA, "AABB", "AABB", "AABB", "AABB", 
      "AABB", "AABB", "AABB", "AAAA", "AAAA", NA, "AAAA", "AAAA", "AAAA", 
      "AAAA", "AAAA", "AAAA", "AAAA", "BBBB", NA, NA, NA, "AAAA", "AAAA", 
      NA, NA, NA, NA, "AAAA", NA, NA, NA, "AAAA", "BBBB", NA, NA, NA, 
      NA, "AABB", NA, NA, NA, "AABB", "AAAA", NA, NA, NA, NA, "AAAA", 
      "AAAA", "AAAA", "BBBB", "AAAA", "BBBB", "BBBB", "BBBB", "BBBB", 
      "BBBB", "AABB", "AABB", "AABB", "AAAA", "AABB", "AAAA", "AABB", 
      "AAAA", "AAAA", "AAAB", "BBBB", "BBBB", NA, "AABB", "AABB", "AABB", 
      "AABB", "AABB", "AABB", "AABB", "AAAA", "AAAA", NA, "AAAA", "AAAA", 
      "AAAA", "AAAA", "AAAA", "AAAA", "AAAA", "BBBB", "BBBB", NA, "BBBB", 
      "BBBB", "AAAA", "AAAA", "BBBB", "BBBB", "ABBB"), .Dim = c(10L, 10L)) 

的数据集我想在每个计算“A”。我尝试了2种方法。

str_countstringr包装。

> apply(aa,2,str_count,"A") 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 2 4 0 4 2 4 2 0 4  0 
[2,] 2 4 1 1 1 4 2 0 4  0 
[3,] 1 1 1 1 1 4 2 1 1  1 
[4,] 2 4 1 1 1 0 4 2 4  0 
[5,] 2 4 4 4 2 4 2 2 4  0 
[6,] 2 4 4 0 4 0 4 2 4  4 
[7,] 2 4 1 1 1 0 2 2 4  4 
[8,] 2 4 1 1 1 0 4 2 4  0 
[9,] 2 4 1 1 1 0 4 2 4  0 
[10,] 2 4 1 1 1 0 3 2 4  1 

这里我得到1的缺失。但我喜欢有NA

regex

dosage<-function(string,char){ 

    x<-sapply(regmatches(string, gregexpr(char, string)), length) 
    return(x) 
} 

apply(aa,2,dosage,"A") 

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 2 4 0 4 2 4 2 0 4  0 
[2,] 2 4 0 0 0 4 2 0 4  0 
[3,] 0 0 0 0 0 4 2 0 0  0 
[4,] 2 4 0 0 0 0 4 2 4  0 
[5,] 2 4 4 4 2 4 2 2 4  0 
[6,] 2 4 4 0 4 0 4 2 4  4 
[7,] 2 4 0 0 0 0 2 2 4  4 
[8,] 2 4 0 0 0 0 4 2 4  0 
[9,] 2 4 0 0 0 0 4 2 4  0 
[10,] 2 4 0 0 0 0 3 2 4  1 

在这里我得到0,但我又喜欢有NA

我该怎么做?

+2

你可以只更换'回报(X)'和'ifelse(is.na(串),NA,X)'和'的功能dosage'将工作,只要你想 – rawr

+1

@rawr是的,这个工作... – Ananta

+0

你的'apply'函数给了我预期的输出 – Jaap

回答

1

您可以直接将str_count直接格式化为matrix

library(stringr) 
matrix(str_count(aa, "A"), nrow=nrow(aa), ncol = ncol(aa)) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 2 4 0 4 2 4 2 0 4  0 
[2,] 2 4 NA NA NA 4 2 0 4  0 
[3,] NA NA NA NA NA 4 2 NA NA NA 
[4,] 2 4 NA NA NA 0 4 2 4  0 
[5,] 2 4 4 4 2 4 2 2 4  0 
[6,] 2 4 4 0 4 0 4 2 4  4 
[7,] 2 4 NA NA NA 0 2 2 4  4 
[8,] 2 4 NA NA NA 0 4 2 4  0 
[9,] 2 4 NA NA NA 0 4 2 4  0 
[10,] 2 4 NA NA NA 0 3 2 4  1 
+0

仍然给我第一个输出。似乎没有认识到“NA”缺失。我试过'is.na(aa)',它给了预期的TRUE/FALSE,虽然 – Ananta

+0

@Ananta这对我有用。也许尝试在新的R会话。 ...其实你的原始'apply'代码也适用于我。 – Frank

+0

有趣的是,原来的和这个解决方案在Windows中工作,但不是Linux。 – Ananta