[R] Is there a quick way to count the number of times each element in a vector appears?
Benilton Carvalho
bcarvalh at jhsph.edu
Tue Mar 6 08:09:58 CET 2007
sorry, i forgot to mention that you will need an extra test.... |-)
tmp <- combinations(3, 3, rep=TRUE)
out <- colSums(apply(tmp, 1, duplicated))+1
out[out == 1] <- 0
but now, re-reading your message, you say
"(..) want to count the number of times each element appears in each
arrangement (...)"
apply(tmp, 1, function(v) table(factor(v, levels=1:3)))
might be what you actually meant.
sorry for the confusion,
b
On Mar 6, 2007, at 2:00 AM, Benilton Carvalho wrote:
> is this what you mean?
>
> tmp <- combinations(3, 3, rep=TRUE)
> colSums(apply(tmp, 1, duplicated))+1
>
> b
>
> On Mar 6, 2007, at 1:16 AM, Dylan Arena wrote:
>
>> Hi there,
>>
>>
>> I'm writing a function that calculates the probability of different
>> outcomes of dice rolls (e.g., the sum of the highest three rolls of
>> five six-sided dice). I'm using the "combinations" function from the
>> "gtools" package, which is great: it gives me a matrix with all of
>> the
>> possible combinations (with repetitions allowed). Now I want to
>> count
>> the number of times each element appears in each arrangement so I can
>> calculate the number of permutations of that arrangement. E.g., if I
>> get output like:
>>
>>> combinations(3,3, rep=TRUE)
>> [,1] [,2] [,3]
>> [1,] 1 1 1
>> [2,] 1 1 2
>> [3,] 1 1 3
>> [4,] 1 2 2
>> [5,] 1 2 3
>> [6,] 1 3 3
>> [7,] 2 2 2
>> [8,] 2 2 3
>> [9,] 2 3 3
>> [10,] 3 3 3
>>
>> I'd like to be able to determine that the first row has 3
>> repetitions,
>> yielding 3!/3! = 1 permutation, while the second row has 3
>> repetitions, yielding 3!/2! = 3 permutations, etc. (This gets harder
>> when there are large numbers of dice with many faces.)
>>
>> I know there are simple things to do, like iterating over the rows
>> with for loops, but I've heard that for loops are sub-optimal in R,
>> and I'd like to see what an elegant solution would look like.
>>
>> E.g., I might like to use sapply() with whatever function I come up
>> with; I thought of using something like duplicated() and just
>> counting
>> the number of TRUEs that are returned for each vector (since the
>> elements are always returned in non-decreasing order), but I'm
>> optimistic that there is a better (faster/cleaner) way.
>>
>> So here is my question in a nutshell:
>> Does anyone have ideas for how I might efficiently process a matrix
>> like that returned by a call to combinations(n, r, rep=TRUE) to
>> determine the number of repetitions of each element in each row of
>> the
>> matrix? If so, I'd love to hear them!
>>
>>
>> Thanks very much for your time,
>> Dylan Arena
>> (Statistics M.S. student)
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-
>> guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-
> guide.html
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list