簡體   English   中英

如何知道一列中每個觀測的頻率並將它們按r排序?

[英]How to know the frequency of each observation in a column and sort them in r?

我有一列,每一行都是一個字符串。 我想找到1.每個序列的頻率2.按頻率從高到低排序結果3.如果多個字符串的頻率相同,則按序列的字母對它們進行排序。

我的數據看起來像

   ID             seq
1   1 BBBBBBIRBBRBBBB
2   2 BBBBBBIRRRRRBBB
3   3 BBBBBBIRRRRRRRR
4   4 BBBBBBITBBBBBBB
5   5 BBBBBBITBBBRBBX
6   6 BBBBBBITTTTBBCX
7   7 BBBBBBITTTTTTTT
8   8 BBBBBBOBBBBBBTX
9   9 BBBBBBOBBBBBBXB
10 10 BBBBBBIRBBRBBBB
11 11 BBBBBBIRRRRRBBB
12 12 BBBBBBIRRRRRRRR
13 13 BBBBBBITBBBBBBB
14 14 BBBBBBITBBBRBBX
15 15 BBBBBBIRBBRBBBB
16 16 BBBBBBIRRRRRBBB
17 17 BBBBBBIRRRRRRRR
18 18 BBBBBBIRBBRBBBB
19 19 BBBBBBIRRRRRBBB
20 20 BBBBBBIRRRRRBBB

ID<-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
seq<-c('BBBBBBIRBBRBBBB','BBBBBBIRBBRBBBB',  'BBBBBBIRRRRRBBB', 'BBBBBBIRRRRRRRR',  'BBBBBBITBBBBBBB',  'BBBBBBITBBBRBBX',  'BBBBBBITTTTBBCX',  'BBBBBBITTTTTTTT',  'BBBBBBOBBBBBBTX',  'BBBBBBOBBBBBBXB',  'BBBBBBIRBBRBBBB',  'BBBBBBIRRRRRBBB',  'BBBBBBIRRRRRRRR',  'BBBBBBITBBBBBBB',  'BBBBBBITBBBRBBX',  'BBBBBBIRBBRBBBB',  'BBBBBBIRRRRRBBB',  'BBBBBBIRRRRRRRR',  'BBBBBBIRBBRBBBB',  'BBBBBBIRRRRRBBB')
data.frame(ID,seq)

我希望結果看起來像這樣

sequence        Frequency
BBBBBBIRBBRBBBB 5
BBBBBBIRRRRRBBB 4
BBBBBBIRRRRRRRR 3
BBBBBBITBBBBBBB 2
BBBBBBITBBBRBBX 1
BBBBBBITTTTBBCX 1
BBBBBBITTTTTTTT 1
BBBBBBOBBBBBBTX 1
BBBBBBOBBBBBBXB 1

提前致謝!!

可以使用data.table做到這data.table

library(data.table)

setDT(df)[, .N, by = seq][order(-N)]

值得注意的是,在不同樣本量的速度方面, data.table始終擊敗dplyr

在此處輸入圖片說明

頂端數是重復原始樣品的次數。

這是要重現的代碼:

library(data.table)
library(dplyr)
dtWay <- function(ID, seq) {
  dt <- data.table(ID, seq);
  setkey(dt, seq);
  return(dt[, .N, by = seq][order(-N)])
}
dplyrWay <- function(ID, seq) {
  df <- data.frame(ID, seq)
  res <- df %>% 
    dplyr::group_by(seq) %>% 
    dplyr::summarize(frequency = length(ID)) %>% 
    dplyr::arrange(desc(frequency)) %>%
    dplyr::rename(sequence = seq)
  return (res)
}

N <- c(3, 4, 5, 6)
n <- 10^N

library(microbenchmark)
dev.off()
par( mfrow = c( 2, 2 ) )
res <- lapply(n, function(x) {

  ID <-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)
  ID <- rep(ID, times = x)
  seq<-c('BBBBBBIRBBRBBBB',  'BBBBBBIRRRRRBBB',   'BBBBBBIRRRRRRRR',  'BBBBBBITBBBBBBB',  'BBBBBBITBBBRBBX',  'BBBBBBITTTTBBCX',  'BBBBBBITTTTTTTT',  'BBBBBBOBBBBBBTX',  'BBBBBBOBBBBBBXB',  'BBBBBBIRBBRBBBB',  'BBBBBBIRRRRRBBB',  'BBBBBBIRRRRRRRR',  'BBBBBBITBBBBBBB',  'BBBBBBITBBBRBBX',  'BBBBBBIRBBRBBBB',  'BBBBBBIRRRRRBBB',  'BBBBBBIRRRRRRRR',  'BBBBBBIRBBRBBBB',  'BBBBBBIRRRRRBBB')
  seq  <- rep(seq, times = x)

  m <- microbenchmark( "data.table" = dtWay(ID, seq),
                       "dplyr" = dplyrWay(ID, seq),
                       times = 10, unit = "sc")

  a <- boxplot(m, main = x, xlab ="", ylab = "time")
})

如果要對排序和名稱施加更多控制,可以使用以下dplyr函數。

library(dplyr)
# assumes df is a data frame with seq and ID columns
df %>% 
  group_by(sequence = seq) %>% 
  summarize(frequency = length(ID)) %>% 
  arrange(-frequency)

我喜歡dplyr

install.packages('dplyr')
library(dplyr)

df <- group_by(df, seq)
df <- count(df, seq)

count(df, seq)
Source: local data frame [9 x 2]

          seq     n
       (fctr) (int)
 1 BBBBBBIRBBRBBBB     4
 2 BBBBBBIRRRRRBBB     4
 3 BBBBBBIRRRRRRRR     3
 4 BBBBBBITBBBBBBB     2
 5 BBBBBBITBBBRBBX     2
 6 BBBBBBITTTTBBCX     1
 7 BBBBBBITTTTTTTT     1
 8 BBBBBBOBBBBBBTX     1
 9 BBBBBBOBBBBBBXB     1

看起來像您想要的輸出,不是嗎? 不確定為什么第一個序列只有4個計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM