[R] filling the matrix row by row in the order from lower to larger elements
ilai
keren at math.montana.edu
Sat Apr 7 00:59:18 CEST 2012
On Fri, Apr 6, 2012 at 4:02 PM, Dimitri Liakhovitski
<dimitri.liakhovitski at gmail.com> wrote:
This works great:
Really ? surprising given it is the EXACT same for-loop as in your
original problem with counter "i" replaced by "k" and reorder to
matrix[!100]<- 0 instead of matrix(0)[i]<- 100
You didn't even attempt to implement Carl's suggestion to use apply
family for looping (which I still think is completely unnecessary).
The only logical conclusion is N=nrow(input) was not large enough to
pose a problem in the first place. In the future please use some brain
power before waisting ours.
Cheers
>
> input<-as.matrix(data.frame(a=c(5,1,3,7),b=c(2,6,4,8)))
> result<-input
> N<-nrow(input)
> for (k in 1:N){
> foo <- which (input == k,arr.ind=T)
> result[k,foo[2]] <-100
> }
> result[result !=100]<-0
>
> Dimitri
>
>
> On Fri, Apr 6, 2012 at 5:14 PM, Carl Witthoft <carl at witthoft.com> wrote:
>> I think the OP wants to fill values in an arbitrarily large matrix. Now,
>> first of all, I'd like to know what his real problem is, since this seems
>> like a very tedious and unproductive matrix to produce. But in the
>> meantime, since he also left out important information, let's assume the
>> input matrix is N rows by M columns, and that he wants therefore to end up
>> with N instances of "100", not counting the original value of 100 that is
>> one of his ranking values (a bad BAD move IMHO).
>>
>> Then either loop or lapply over an equation like (I've expanded things more
>> than necessary for clarity
>> result<-inmatrix
>> for (k in 1:N){
>> foo <- which (inmatrix == k,arr.ind=T)
>> result[k,foo[2]] <-100
>>
>> }
>>
>>
>>
>> I maybe missing something but this seems like an indexing problem
>> which doesn't require a loop at all. Something like this maybe?
>>
>> (input<-matrix(c(5,1,3,7,2,6,4,8),nc=2))
>> output <- matrix(0,max(input),2)
>> output[input[,1],1] <- 100
>> output[input[,2],2] <- 100
>> output
>>
>> Cheers
>>
>>
>> On Fri, Apr 6, 2012 at 1:49 PM, Dimitri Liakhovitski
>> <dimitri.liakhovitski at gmail.com> wrote:
>>> Hello, everybody!
>>>
>>> I have a matrix "input" (see example below) - with all unique entries
>>> that are actually unique ranks (i.e., start with 1, no ties).
>>> I want to assign a value of 100 to the first row of the column that
>>> contains the minimum (i.e., value of 1).
>>> Then, I want to assign a value of 100 to the second row of the column
>>> that contains the value of 2, etc.
>>> The results I am looking for are in "desired.results".
>>> My code (below) does what I need. But it's using a loop through all
>>> the rows of my matrix and searches for a matrix element every time.
>>> My actual matrix is very large. Is there a way to do it more efficiently?
>>> Thank you very much for the tips!
>>> Dimitri
>>>
>>> input<-as.matrix(data.frame(a=c(5,1,3,7),b=c(2,6,4,8)))
>>> (input)
>>> desired.result<-as.matrix(data.frame(a=c(100,0,100,0),b=c(0,100,0,100)))
>>> (desired.result)
>>> result<-as.matrix(data.frame(a=c(0,0,0,0),b=c(0,0,0,0)))
>>> for(i in 1:nrow(input)){ # i<-1
>>> mymin<-i
>>> mycoords<-which(input==mymin,arr.ind=TRUE)
>>> result[i,mycoords[2]]<-100
>>> input[mycoords]<-max(input)
>>> }
>>> (result)
>>>
>> --
>>
>> Sent from my Cray XK6
>> "Quidvis recte factum, quamvis humile, praeclarum."
>>
>>
>> ______________________________________________
>> R-help at r-project.org 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.
>
>
>
> --
> Dimitri Liakhovitski
> marketfusionanalytics.com
>
> ______________________________________________
> R-help at r-project.org 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