I loaded your data as the object aa.
    mydata <-  data.frame(seqs = aa$Sequence, mods = aa$modifications) # subset of aa with sequences and modifications
    ##to find number of "K"s
    spl_seqs <- strsplit(as.character(mydata$seqs), split = "")  # split all sequences (use "as.character" because they are turned into factor)
    where_K <- lapply(spl_seqs, grep, pattern = "K") # find positions of "K"s in each sequence
    No_K <- lapply(where_K, length) # count "K"s in each sequence
    mydata$No_Ks <- No_K #add a column that informs about the number of "K"s in each sequence
    ##
I suppose all upper-case letters that appear to "modifications" column either refer to the modification being made or to the "K". I can't think of any other way to simplify the "modifications" column in order to manipulate them. So I, just, keep the uppercase letters that are not "K":
    names(LETTERS) <- LETTERS  # DWin's idea in this http://stackoverflow.com/questions/4423460/is-there-a-function-to-find-all-lower-case-letters-in-a-character-vector 
    spl_mods <- strsplit(as.character(mydata$mods), split = "")  # split the characters in each modification row
Simplify modifications column keeping only the first letter of each modification:
    mods_ls <- vector("list", length = nrow(mydata))  #list to fill with simplified modifications
    for(i in 1:length(spl_mods))
     {
      res <- as.character(na.omit(LETTERS[strsplit(as.character(mydata$mods), split = "")[[i]]])) #keep only upper-case letters
      res <- as.character(na.omit(gsub("K", NA, res)))  # exclude "K"s 
      res <- as.character(na.omit(gsub("M", NA, res)))  # and "M"s I guessed
      mods_ls[[i]] <- res
     }
    mydata$simplified_mods <- unlist(lapply(mods_ls, paste, collapse = " ; ")) 
What we've got so far:
    mydata[1:10,]
    #                seqs                                          mods No_Ks simplified_mods
    #1    AAAAGAAAVANQGKK               [14] Acetyl (K)|[15] Acetyl (K)     2           A ; A
    #2    AAAAGAAAVANQGKK               [14] Acetyl (K)|[15] Acetyl (K)     2           A ; A
    #3      AAFTKLDQVWGSE                                [5] Acetyl (K)     1               A
    #4  AAIKFIKFINPKINDGE [4] Acetyl (K)|[7] Acetyl (K)|[12] Acetyl (K)     3       A ; A ; A
    #5  AAIKFIKFINPKINDGE [4] Acetyl (K)|[7] Acetyl (K)|[12] Acetyl (K)     3       A ; A ; A
    #6  AAIKFIKFINPKINDGE                [7] Acetyl (K)|[12] Acetyl (K)     3           A ; A
    #7  AAIKFIKFINPKINDGE                 [4] Acetyl (K)|[7] Acetyl (K)     3           A ; A
    #8     AAIYKLLKSHFRNE                 [5] Biotin (K)|[8] Acetyl (K)     2           B ; A
    #9            AAKKFEE                 [3] Acetyl (K)|[4] Acetyl (K)     2           A ; A
    #10           AAKYFRE                                [3] Acetyl (K)     1               A 
Then you can subset the number of "K"s and the specific modifications you want. E.g.:
    how_many_K <- 2 
    what_mods <- "A ; A"    #separated by [space];[space]
    show_rows <- which(mydata$No_Ks == how_many_K & mydata$simplified_mods == what_mods)  
    mydata[show_rows,]
    #                             seqs                            mods No_Ks simplified_mods
    #1                 AAAAGAAAVANQGKK [14] Acetyl (K)|[15] Acetyl (K)     2           A ; A
    #2                 AAAAGAAAVANQGKK [14] Acetyl (K)|[15] Acetyl (K)     2           A ; A
    #9                         AAKKFEE   [3] Acetyl (K)|[4] Acetyl (K)     2           A ; A
    #11                     AANVKKTLVE   [5] Acetyl (K)|[6] Acetyl (K)     2           A ; A
    #14  AARDSKSPIILQTSNGGAAYFAGKGISNE  [6] Acetyl (K)|[24] Acetyl (K)     2           A ; A
    #20                        AEKLKAE   [3] Acetyl (K)|[5] Acetyl (K)     2           A ; A
    #21
    #....
EDIT: All this can be done in a function like fun. x is your data.frame (as the uploaded "for Henrik" with the structure). noK is the number of "K"s you want. mod is the modifications you want separated by [space];[space] (e.g. "B ; A ; O").:
    fun <- function(x, noK, no_modK = NULL, mod = NULL) #EDIT_1e: update arguments; made optional
    {
     mydata <- data.frame(seqs = x$Sequence, mods = x$modifications) 
     spl_seqs <- strsplit(as.character(mydata$seqs), split = "")  
     where_K <- lapply(spl_seqs, grep, pattern = "K") 
     No_K <- lapply(where_K, length)
     mydata$No_Ks <- No_K 
     names(LETTERS) <- LETTERS  
     spl_mods <- strsplit(as.character(mydata$mods), split = "")  
     mods_ls <- vector("list", length = nrow(mydata))  
     for(i in 1:length(spl_mods))
      {
       res <- as.character(na.omit(LETTERS[strsplit(as.character(mydata$mods), split = "")[[i]]])) 
       no_modedK <- length(grep("K", res))   #EDIT_1a: how many "K"s are modified?
       res <- as.character(na.omit(gsub("K", NA, res)))   
       res <- as.character(na.omit(gsub("M", NA, res)))  
       mods_ls[[i]] <- list(mods = res, modified_K = no_modedK) #EDIT_1b: catch number of "K"s modified (along with the actual modifications) 
      }
     mydata$no_modK <- unlist(lapply(lapply(lapply(mods_ls, `[`, 2), unlist), paste, collapse = " ; ")) #EDIT_1d: insert number of modified "K"s in "mydata"   
     mydata$simplified_mods <- unlist(lapply(lapply(lapply(mods_ls, `[`, 1), unlist), paste, collapse = " ; ")) #EDIT_1c: insert mods in "mydata"  
     if(!is.null(no_modK) & !is.null(mod)) #EDIT_1f: update "return"
      {
       show_rows <- which(mydata$No_Ks == noK & mydata$no_modK == no_modK & mydata$simplified_mods == mod) 
      }
     if(is.null(no_modK) & !is.null(mod))
      {
       show_rows <- which(mydata$No_Ks == noK & mydata$simplified_mods == mod) 
      } 
     if(is.null(mod) & !is.null(no_modK)) 
      {
       show_rows <- which(mydata$No_Ks == noK & mydata$no_modK == no_modK)
      }
     if(is.null(no_modK) & is.null(mod)) 
      {
       show_rows <- which(mydata$No_Ks == noK) 
      } 
     return(mydata[show_rows,])
    }
E.g.:
    fun(aa, noK = 3) #aa is the the "for Henrik" loaded in `R` (aa <- structure( ... )
                                  seqs                                                             mods No_Ks no_modK simplified_mods
    4                AAIKFIKFINPKINDGE                    [4] Acetyl (K)|[7] Acetyl (K)|[12] Acetyl (K)     3       3       A ; A ; A
    5                AAIKFIKFINPKINDGE                    [4] Acetyl (K)|[7] Acetyl (K)|[12] Acetyl (K)     3       3       A ; A ; A
    6                AAIKFIKFINPKINDGE                                   [7] Acetyl (K)|[12] Acetyl (K)     3       2           A ; A
    #...
    fun(aa, noK = 3, no_modK = 2)
                             seqs                                             mods No_Ks no_modK simplified_mods
    6           AAIKFIKFINPKINDGE                   [7] Acetyl (K)|[12] Acetyl (K)     3       2           A ; A
    7           AAIKFIKFINPKINDGE                    [4] Acetyl (K)|[7] Acetyl (K)     3       2           A ; A
    #...
    fun(aa, noK = 2, mod = "A ; B")
                  seqs                           mods No_Ks no_modK simplified_mods
    200    ISAMVLTKMKE [8] Acetyl (K)|[10] Biotin (K)     2       2           A ; B
    441 NLKPSKPSYYLDPE  [3] Acetyl (K)|[6] Biotin (K)     2       2           A ; B
    #...
    fun(aa, noK = 2, no_modK = 1, mod =  "A")
                                     seqs            mods No_Ks no_modK simplified_mods
    15      AARDSKSPIILQTSNGGAAYFAGKGISNE [24] Acetyl (K)     2       1               A
    27                     AKALVAQGVKFIAE  [2] Acetyl (K)     2       1               A
    #...
EDIT_1: Updated fun and examples.