لدي متجه من الأرقام:
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 في المتجه؟
يمكنك فقط استخدام 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
أو قم بتحويله إلى إطار بيانات. إذا كنت أكثر راحة في التعامل مع ذلك:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
الطريقة الأكثر مباشرة هي sum(numbers == x)
.
numbers == x
تنشئ متجهًا منطقيًا يساوي TRUE في كل مكان تحدث فيه x ، وعندما يتم sum
ing ، يتم توجيه الموجه المنطقي إلى رقم رقمي يحول TRUE إلى 1 و FALSE إلى 0.
ومع ذلك ، لاحظ أنه بالنسبة لأرقام الفاصلة العائمة ، من الأفضل استخدام شيء مثل: sum(abs(numbers - x) < 1e-6)
.
ربما سأفعل شيئًا كهذا
length(which(numbers==x))
ولكن في الحقيقة ، هناك طريقة أفضل
table(numbers)
هناك أيضًا count(numbers)
من الحزمة plyr
. أكثر ملاءمة بكثير من table
في رأيي.
يستخدم الحل المفضل الخاص بي rle
، والذي سيعود بقيمة (التسمية ، x
في مثالك) وطولًا ، وهو ما يمثل عدد مرات ظهور هذه القيمة في التسلسل.
من خلال الجمع بين rle
مع sort
، لديك طريقة سريعة للغاية لحساب عدد مرات ظهور أي قيمة. هذا يمكن أن يكون مفيدا مع مشاكل أكثر تعقيدا.
مثال:
> 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 هو أسرع طريقة للحصول على عدد وتخزينها جميعًا.
هناك وظيفة قياسية في R لذلك
tabulate(numbers)
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
إليك طريقة سريعة وقذرة:
x <- 23
length(subset(numbers, numbers==x))
إذا كنت تريد حساب عدد مرات الظهور لاحقًا ، فيمكنك الاستفادة من دالة 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
يمكنك تغيير الرقم إلى ما تشاء في السطر التالي
length(which(numbers == 4))
باستخدام الجدول ولكن دون مقارنة بـ 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)
طريقة أخرى أجدها مريحة هي:
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
هذا يمكن تخزينها على شكل dataframe إذا كان المفضل.
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
هناك طرق مختلفة لحساب عناصر محددة
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']])
يمكن القيام بذلك باستخدام outer
للحصول على نموذج للمساواة يليه rowSums
، بمعنى واضح.
من أجل الحصول على التعداد و numbers
في نفس مجموعة البيانات ، يتم إنشاء إطار بيانات أولاً. هذه الخطوة غير مطلوبة إذا كنت تريد إدخال وإخراج منفصلين.
df <- data.frame(No = numbers)
df$count <- rowSums(outer(df$No, df$No, FUN = `==`))