首页 文章

使用向量中的x值计算元素的数量

提问于
浏览
335

我有一个数字向量:

numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
         453,435,324,34,456,56,567,65,34,435)

如何计算值x在向量中出现的次数?

13 回答

  • 3

    R中有一个标准函数

    tabulate(numbers)

  • 31

    使用表但不与 names 比较:

    numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435)
    x <- 67
    numbertable <- table(numbers)
    numbertable[as.character(x)]
    #67 
    # 2
    

    当您多次使用不同元素的计数时, table 非常有用 . 如果您只需要一个计数,请使用 sum(numbers == x)

  • 422

    你可以使用 table()

    > a <- table(numbers)
    > a
    numbers
      4   5  23  34  43  54  56  65  67 324 435 453 456 567 657 
      2   1   2   2   1   1   2   1   2   1   3   1   1   1   1
    

    然后你可以将它子集化:

    > a[names(a)==435]
    435 
      3
    

    或者如果您更熟悉它,请将其转换为data.frame:

    > as.data.frame(table(numbers))
       numbers Freq
    1        4    2
    2        5    1
    3       23    2
    4       34    2
    ...
    
  • 224

    我觉得方便的另一种方法是:

    numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
    (s<-summary (as.factor(numbers)))
    

    这会将数据集转换为factor,然后summary()为我们提供控件总数(唯一值的计数) .

    输出是:

    4   5  23  34  43  54  56  65  67 324 435 453 456 567 657 
    2   1   2   2   1   1   2   1   2   1   3   1   1   1   1
    

    如果愿意,可以将其存储为数据帧 .

    as.data.frame(cbind(Number = names(s),Freq = s),stringsAsFactors = F,row.names = 1:length(s))

    这里row.names已用于重命名行名 . 不使用row.names,s中的列名称用作新数据帧中的行名称

    输出是:

    Number Freq
    1       4    2
    2       5    1
    3      23    2
    4      34    2
    5      43    1
    6      54    1
    7      56    2
    8      65    1
    9      67    2
    10    324    1
    11    435    3
    12    453    1
    13    456    1
    14    567    1
    15    657    1
    
  • 47

    这是一个快速而肮脏的方式:

    x <- 23
    length(subset(numbers, numbers==x))
    
  • 2
    numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435 453,435,324,34,456,56,567,65,34,435)
    
    > length(grep(435, numbers))
    [1] 3
    
    
    > length(which(435 == numbers))
    [1] 3
    
    
    > require(plyr)
    > df = count(numbers)
    > df[df$x == 435, ] 
         x freq
    11 435    3
    
    
    > sum(435 == numbers)
    [1] 3
    
    
    > sum(grepl(435, numbers))
    [1] 3
    
    
    > sum(435 == numbers)
    [1] 3
    
    
    > tabulate(numbers)[435]
    [1] 3
    
    
    > table(numbers)['435']
    435 
      3 
    
    
    > length(subset(numbers, numbers=='435')) 
    [1] 3
    
  • 33

    计算特定元素的方法有很多种

    library(plyr)
    numbers =c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,7,65,34,435)
    
    print(length(which(numbers==435)))
    
    #Sum counts number of TRUE's in a vector 
    print(sum(numbers==435))
    print(sum(c(TRUE, FALSE, TRUE)))
    
    #count is present in plyr library 
    #o/p of count is a DataFrame, freq is 1 of the columns of data frame
    print(count(numbers[numbers==435]))
    print(count(numbers[numbers==435])[['freq']])
    
  • 8

    我的首选解决方案使用 rle ,它将返回一个值(标签,在您的示例中为 x )和一个长度,表示该值在序列中出现的次数 .

    通过将 rlesort 组合,您可以非常快速地计算任何值出现的次数 . 这可能对更复杂的问题有所帮助 .

    例:

    > numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
    > a <- rle(sort(numbers))
    > a
      Run Length Encoding
        lengths: int [1:15] 2 1 2 2 1 1 2 1 2 1 ...
        values : num [1:15] 4 5 23 34 43 54 56 65 67 324 ...
    

    如果您想要的值未显示,或者您需要存储该值以供日后使用,请将 a 设为 data.frame .

    > b <- data.frame(number=a$values, n=a$lengths)
    > b
        values n
     1       4 2
     2       5 1
     3      23 2
     4      34 2
     5      43 1
     6      54 1
     7      56 2
     8      65 1
     9      67 2
     10    324 1
     11    435 3
     12    453 1
     13    456 1
     14    567 1
     15    657 1
    

    我发现我很少想知道一个值的频率而不是所有的值,并且rle似乎是获得计数和存储它们的最快方法 .

  • 8

    我可能会做这样的事情

    length(which(numbers==x))
    

    但实际上,更好的方法是

    table(numbers)
    
  • 7

    最直接的方式是 sum(numbers == x) .

    numbers == x 创建一个逻辑向量,在x出现的每个位置都为TRUE,当 sum 时,逻辑向量被强制转换为numeric,将TRUE转换为1,将FALSE转换为0 .

    但是,请注意,对于浮点数,最好使用以下内容: sum(abs(numbers - x) < 1e-6) .

  • 16

    如果要随后计算出现次数,可以使用 sapply 函数:

    index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
    cbind(numbers, index)
    

    输出:

    numbers index
     [1,]       4     1
     [2,]      23     1
     [3,]       4     2
     [4,]      23     2
     [5,]       5     1
     [6,]      43     1
     [7,]      54     1
     [8,]      56     1
     [9,]     657     1
    [10,]      67     1
    [11,]      67     2
    [12,]     435     1
    [13,]     453     1
    [14,]     435     2
    [15,]     324     1
    [16,]      34     1
    [17,]     456     1
    [18,]      56     2
    [19,]     567     1
    [20,]      65     1
    [21,]      34     2
    [22,]     435     3
    
  • 1

    您可以在下一行中将数字更改为您想要的任何数字

    length(which(numbers == 4))
    
  • 7

    count(numbers) 包中也有 count(numbers) . 在我看来比 table 方便得多 .

相关问题