[R] populating matrix with binary variable after matching data from data frame

Adrian Johnson oriolebaltimore at gmail.com
Wed Aug 13 23:33:24 CEST 2014


Hello again. sorry for question again.

may be I was not clear in asking before.

 I don't want to remove rows from matrix, since row names and column
names are identical in matrix.


I tried your suggestion and here is what I get:

> fx <- function(x,x1){
+ i <- as.matrix(x1[,c("V1","V2")])
+ x[i]<-1
+ x
+ }
> fx(x, x1)

Error in `[<-`(`*tmp*`, i, value = 1) : subscript out of bounds




> x[1:4,1:4]
       ABCA10 ABCA12 ABCA13 ABCA4
ABCA10      0      0      0     0
ABCA12      0      0      0     0
ABCA13      0      0      0     0
ABCA4       0      0      0     0


> x1[1:10,]
      V1       V2
1   AKT3    TCL1A
2  AKTIP    VPS41
3  AKTIP    PDPK1
4  AKTIP   GTF3C1
5  AKTIP    HOOK2
6  AKTIP    POLA2
7  AKTIP KIAA1377
8  AKTIP FAM160A2
9  AKTIP    VPS16
10 AKTIP    VPS18


For instance, now I will loop over x1, I go to first row, I get V1 and
check if if I have a row in x that have item in V1 and then check V2
exist in colnames, if match then I assign 1. If not I go to row 2.

In some rows, it is possible that I will only see element in V2 that
exist in row names  and since element in V1 does not exist in X
matrix, I will give 0. (since matrix X has identical row and column
names, i feel it does not matter to check an element in column names
after we check in row names)



now for instance, If in X1 if I see ABCA10 in x1$V1 and ABCA10 in
x1$V2 then in matrix X column 1 and row 1  should get 1.

dput - follows..

x <- structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(4L,
4L), .Dimnames = list(c("ABCA10", "ABCA12", "ABCA13", "ABCA4"
), c("ABCA10", "ABCA12", "ABCA13", "ABCA4")))


x1 <- structure(list(V1 = c("AKT3", "AKTIP", "AKTIP", "AKTIP", "AKTIP",
"AKTIP", "AKTIP", "AKTIP", "AKTIP", "AKTIP"), V2 = c("TCL1A",
"VPS41", "PDPK1", "GTF3C1", "HOOK2", "POLA2", "KIAA1377", "FAM160A2",
"VPS16", "VPS18")), .Names = c("V1", "V2"), row.names = c(NA,
10L), class = "data.frame")



Thanks for your time.




On Wed, Aug 13, 2014 at 12:51 PM, William Dunlap <wdunlap at tibco.com> wrote:
> You can replace the loop
>> for (i in nrow(x1)) {
>>    x[x1$V1[i], x1$V2[i]] <- 1;
>> }
> by
> f <- function(x, x1) {
>   i <- as.matrix(x1[, c("V1","V2")]) # 2-column matrix to use as a subscript
>   x[ i ] <- 1
>   x
> }
> f(x, x1)
>
> You will get an error if not all the strings in the subscript matrix
> are in the row or
> column names of x.  What do you want to happen in this case.  You can choose
> to first omit the bad rows in the subscript matrix
>     goodRows <- is.element(i[,1], dimnames(x)[1]) &  is.element(i[,2],
> dimnames(x)[2])
>     i <- i[goodRows, , drop=FALSE]
>     x[ i ] <- 1
> or you can choose to expand x to include all the names found in x1.
>
> It would be good if you included some toy data to better illustrate
> what you want to do.
> E.g., with
>   x <- array(0, c(3,3), list(Row=paste0("R",1:3),Col=paste0("C",1:3)))
>   x1 <- data.frame(V1=c("R1","R3"), V2=c("C2","C1"))
> the above f() gives
>> f(x, x1)
>     Col
> Row  C1 C2 C3
>   R1  0  1  0
>   R2  0  0  0
>   R3  1  0  0
> Is that what you are looking for?



More information about the R-help mailing list