Try this:
x[,2][x[,1][x[,1] > 0]] <- table(x[,2])[as.character(x[,1][x[,1] > 0])]
On Thu, Jan 15, 2009 at 10:36 AM, Guillaume Chapron <
carnivorescience@gmail.com> wrote:
> Hello,
>
> I create this array:
>
> x <- cbind(c(1:4, rep(0,10)), c(rep(0,4), 1:2, rep(3,6), 4,5))
>
> [,1] [,2]
> [1,] 1 0
> [2,] 2 0
> [3,] 3 0
> [4,] 4 0
> [5,] 0 1
> [6,] 0 2
> [7,] 0 3
> [8,] 0 3
> [9,] 0 3
> [10,] 0 3
> [11,] 0 3
> [12,] 0 3
> [13,] 0 4
> [14,] 0 5
>
> I would like to do the following in vector syntax:
>
> for rows where the first column is not 0, put into the second column the
> number of times the value of the first column appears in the second column
> of rows where the value in the first row is 0
>
> I'm not sure this sounds super clear, so I will show what I want to
get:
>
> [,1] [,2]
> [1,] 1 1
> [2,] 2 1
> [3,] 3 6
> [4,] 4 1
> [5,] 0 1
> [6,] 0 2
> [7,] 0 3
> [8,] 0 3
> [9,] 0 3
> [10,] 0 3
> [11,] 0 3
> [12,] 0 3
> [13,] 0 4
> [14,] 0 5
>
> So for example, x[3,2] = 6, because length(x[x[,1]==0 & x[,2]==3,2]) =
6
>
> I have tried this:
>
> x[x[,1]!=0,2] <- length(x[x[,1]==0 & x[,2] %in% which(x[,1]!=0),2])
>
> but it does not work correctly as it put the same value in the changed
> rows.
>
> Thanks for your help!
>
> Guillaume
>
> ______________________________________________
> R-help@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.
>
--
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O
[[alternative HTML version deleted]]