У меня есть вектор чисел:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
453,435,324,34,456,56,567,65,34,435)
Как я могу заставить R подсчитать количество раз, когда значение x появляется в векторе?
Вы можете просто использовать 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
...
Самый прямой путь-это сумма(цифрами == х)`.
номера == х` создает логический вектор, который является истинным в любом месте, что событие X происходит, и когда сумма передоза, логический вектор приводится к числовому который преобразует true 1, а false в 0.
Однако, обратите внимание, что для чисел с плавающей запятой, это'ы лучше использовать что-то вроде: сумма(АБС(числа - X) < 1е-6)
.
Существует также считать(цифры) от plyr пакет. Гораздо удобнее, чем "таблица" на мой взгляд.
Мой предпочтительным решением, использует метод RLE`, который будет возвращать значение (метку " х " в вашем примере) и длиной, которая представляет, сколько раз это значение появилось в последовательности.
Комбинируя метода RLE
с Рода
, у вас есть очень быстрый способ, чтобы подсчитать количество раз любое значение появилось. Это может быть полезно с еще более сложными проблемами.
Пример:
> 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
данных.рамка`.
> 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
Я считаю, это редкое, что я хочу знать частоту одно значение и не все значения, и РЛЭ, кажется, самый быстрый способ получить рассчитывать и хранить их все.
Есть стандартная функция в R для этого
табулирование(номера)
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
Если вы хотите рассчитывать в дальнейшем количество выступлений, вы можете использовать функция поставка
:
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
Вы можете изменить номер, что вы хотите на следующую строку
length(which(numbers == 4))
Используя таблицы, но без сравнения с именами
:
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
"таблица" полезен, когда вы используете количество различных элементов в несколько раз. Если вам нужен только один счетчик, использовать сумма(цифрами == х)`
Еще один способ найти удобно:
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)))
Это преобразует набор данных в фактор, и тогда резюме() дает нам контроль итогов (подсчет уникальных значений).
Вывод:
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
Это могут быть сохранены в таблице данных, если предпочтительнее.
как.данных.рамка(cbind(количество = имена(s),частота = с), stringsAsFactors=Ф ряд.имена = 1:длина(ов))
здесь строки.имена использовался переименовать имена строк. без использования строк.имена, имена столбцов в 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
Существуют различные способы подсчета конкретных элементов
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']])
Это может быть сделано с внешний
, чтобы получить метрику равенств следует rowSums
, с явным смыслом.
Для того, чтобы иметь номера счетчиков и в тот же набор данных, данных.каркас создается впервые. Этот шаг не нужен, если вы хотите отдельный вход и выход.
df <- data.frame(No = numbers)
df$count <- rowSums(outer(df$No, df$No, FUN = `==`))