I applied this code in a loop function but since in some matrices there isn't any 2, so I got the below error: idx<- apply(lofGT_met,1, function(x)as.numeric(any(x==2 & !is.na(x)))) Error in apply(lofGT_met, 1, function(x){(any(x == 2)}) : dim(X) must have a positive length would you please let me know how to correct it? Thanks On Mon, Aug 10, 2015 at 3:27 PM, Sarah Goslee <sarah.goslee at gmail.com> wrote:> Easy enough (note that your column names are problematic, though) > > > mydata <- structure(list(X125 = c(0L, 1L, 2L, 0L, 2L), X255 = c(1L, 1L, > + 1L, 1L, 0L), X558 = c(0L, 0L, 2L, 0L, 0L), X2366 = c(NA, NA, > + 1L, NA, 0L), X177 = c(0L, 0L, 0L, 0L, 0L), X255.1 = c(0L, 1L, > + 0L, 0L, 0L)), .Names = c("X125", "X255", "X558", "X2366", "X177", > + "X255.1"), class = "data.frame", row.names = c("aa", "bb", "cs", > + "de", "gh")) > > mydata$idx <- apply(mydata, 1, function(x)as.numeric(any(x == 2 & !is.na > (x)))) > > mydata > X125 X255 X558 X2366 X177 X255.1 idx > aa 0 1 0 NA 0 0 0 > bb 1 1 0 NA 0 1 0 > cs 2 1 2 1 0 0 1 > de 0 1 0 NA 0 0 0 > gh 2 0 0 0 0 0 1 > > Sarah > > On Mon, Aug 10, 2015 at 4:11 PM, Lida Zeighami <lid.zigh at gmail.com> wrote: > >> Hi there, >> >> I have a matrix contain 0,1,2, NA elements. >> I want to add a column to this matrix with name of "idx" . then for each >> row, I should put 1 in this column (idx) if there is at least one 2 in >> that >> row otherwise I should put 0 in this column! >> >> for example mydata: >> >> 125 255 558 2366 177 255 >> aa 0 1 0 NA 0 0 >> bb 1 1 0 NA 0 1 >> cs 2 1 2 1 0 0 >> de 0 1 0 NA 0 0 >> gh 2 0 0 0 0 0 >> >> >> my output should be: >> >> >> 125 255 558 2366 177 255 idx >> aa 0 1 0 NA 0 0 0 >> bb 1 1 0 NA 0 1 0 >> cs 2 1 2 1 0 0 1 >> de 0 1 0 NA 0 0 0 >> gh 2 0 0 2 0 2 1 >> >> Thank you for your help. >> > -- > Sarah Goslee > http://www.functionaldiversity.org >[[alternative HTML version deleted]]
On Wed, Aug 12, 2015 at 2:04 PM, Lida Zeighami <lid.zigh at gmail.com> wrote:> I applied this code in a loop function but since in some matrices there > isn't any 2, so I got the below error: > > idx<- apply(lofGT_met,1, function(x)as.numeric(any(x==2 & !is.na(x)))) > > > Error in apply(lofGT_met, 1, function(x){(any(x == 2)}) : > dim(X) must have a positive lengthThat has nothing to do with whether there are any values of 2 in the data frame. The code I suggested can handle that: no2 <- structure(list(X125 = c(0L, 1L, 1L, 0L, 1L), X255 = c(1L, 1L, 1L, 1L, 0L), X558 = c(0L, 0L, 1L, 0L, 0L), X2366 = c(NA, NA, 1L, NA, 0L), X177 = c(0L, 0L, 0L, 0L, 0L), X255.1 = c(0L, 1L, 0L, 0L, 0L)), .Names = c("X125", "X255", "X558", "X2366", "X177", "X255.1"), class = "data.frame", row.names = c("aa", "bb", "cs", "de", "gh")) no2 apply(no2, 1, function(x)as.numeric(any(x == 2 & !is.na(x))))> no2X125 X255 X558 X2366 X177 X255.1 aa 0 1 0 NA 0 0 bb 1 1 0 NA 0 1 cs 1 1 1 1 0 0 de 0 1 0 NA 0 0 gh 1 0 0 0 0 0> apply(no2, 1, function(x)as.numeric(any(x == 2 & !is.na(x))))aa bb cs de gh 0 0 0 0 0 It also works for rows that are entirely NA. Thus, I'm forced to conclude that there's something odd about lofGT_met, and you'll need to provide more information about that data frame, and a reproducible example, for a solution to be offered. Sarah> > would you please let me know how to correct it? > Thanks > > On Mon, Aug 10, 2015 at 3:27 PM, Sarah Goslee <sarah.goslee at gmail.com> > wrote: >> >> Easy enough (note that your column names are problematic, though) >> >> > mydata <- structure(list(X125 = c(0L, 1L, 2L, 0L, 2L), X255 = c(1L, 1L, >> + 1L, 1L, 0L), X558 = c(0L, 0L, 2L, 0L, 0L), X2366 = c(NA, NA, >> + 1L, NA, 0L), X177 = c(0L, 0L, 0L, 0L, 0L), X255.1 = c(0L, 1L, >> + 0L, 0L, 0L)), .Names = c("X125", "X255", "X558", "X2366", "X177", >> + "X255.1"), class = "data.frame", row.names = c("aa", "bb", "cs", >> + "de", "gh")) >> > mydata$idx <- apply(mydata, 1, function(x)as.numeric(any(x == 2 & >> > !is.na(x)))) >> > mydata >> X125 X255 X558 X2366 X177 X255.1 idx >> aa 0 1 0 NA 0 0 0 >> bb 1 1 0 NA 0 1 0 >> cs 2 1 2 1 0 0 1 >> de 0 1 0 NA 0 0 0 >> gh 2 0 0 0 0 0 1 >> >> Sarah >> >> On Mon, Aug 10, 2015 at 4:11 PM, Lida Zeighami <lid.zigh at gmail.com> wrote: >>> >>> Hi there, >>> >>> I have a matrix contain 0,1,2, NA elements. >>> I want to add a column to this matrix with name of "idx" . then for each >>> row, I should put 1 in this column (idx) if there is at least one 2 in >>> that >>> row otherwise I should put 0 in this column! >>> >>> for example mydata: >>> >>> 125 255 558 2366 177 255 >>> aa 0 1 0 NA 0 0 >>> bb 1 1 0 NA 0 1 >>> cs 2 1 2 1 0 0 >>> de 0 1 0 NA 0 0 >>> gh 2 0 0 0 0 0 >>> >>> >>> my output should be: >>> >>> >>> 125 255 558 2366 177 255 idx >>> aa 0 1 0 NA 0 0 0 >>> bb 1 1 0 NA 0 1 0 >>> cs 2 1 2 1 0 0 1 >>> de 0 1 0 NA 0 0 0 >>> gh 2 0 0 2 0 2 1 >>>
Thanks Sarah, I use your code in a loop, so each time I have different matrix, means lofGT_met changed each time! some times I have just one column in matrix so my matrix will be n*1 (the number of rows is the same =n) do you think it cause the error? On Wed, Aug 12, 2015 at 1:12 PM, Sarah Goslee <sarah.goslee at gmail.com> wrote:> On Wed, Aug 12, 2015 at 2:04 PM, Lida Zeighami <lid.zigh at gmail.com> wrote: > > I applied this code in a loop function but since in some matrices there > > isn't any 2, so I got the below error: > > > > idx<- apply(lofGT_met,1, function(x)as.numeric(any(x==2 & !is.na(x)))) > > > > > > Error in apply(lofGT_met, 1, function(x){(any(x == 2)}) : > > dim(X) must have a positive length > > That has nothing to do with whether there are any values of 2 in the > data frame. The code I suggested can handle that: > > > no2 <- structure(list(X125 = c(0L, 1L, 1L, 0L, 1L), X255 = c(1L, 1L, > 1L, 1L, 0L), X558 = c(0L, 0L, 1L, 0L, 0L), X2366 = c(NA, NA, > 1L, NA, 0L), X177 = c(0L, 0L, 0L, 0L, 0L), X255.1 = c(0L, 1L, > 0L, 0L, 0L)), .Names = c("X125", "X255", "X558", "X2366", "X177", > "X255.1"), class = "data.frame", row.names = c("aa", "bb", "cs", > "de", "gh")) > > no2 > apply(no2, 1, function(x)as.numeric(any(x == 2 & !is.na(x)))) > > > > no2 > X125 X255 X558 X2366 X177 X255.1 > aa 0 1 0 NA 0 0 > bb 1 1 0 NA 0 1 > cs 1 1 1 1 0 0 > de 0 1 0 NA 0 0 > gh 1 0 0 0 0 0 > > apply(no2, 1, function(x)as.numeric(any(x == 2 & !is.na(x)))) > aa bb cs de gh > 0 0 0 0 0 > > It also works for rows that are entirely NA. Thus, I'm forced to > conclude that there's something odd about lofGT_met, and you'll need > to provide more information about that data frame, and a reproducible > example, for a solution to be offered. > > Sarah > > > > > > would you please let me know how to correct it? > > Thanks > > > > On Mon, Aug 10, 2015 at 3:27 PM, Sarah Goslee <sarah.goslee at gmail.com> > > wrote: > >> > >> Easy enough (note that your column names are problematic, though) > >> > >> > mydata <- structure(list(X125 = c(0L, 1L, 2L, 0L, 2L), X255 = c(1L, > 1L, > >> + 1L, 1L, 0L), X558 = c(0L, 0L, 2L, 0L, 0L), X2366 = c(NA, NA, > >> + 1L, NA, 0L), X177 = c(0L, 0L, 0L, 0L, 0L), X255.1 = c(0L, 1L, > >> + 0L, 0L, 0L)), .Names = c("X125", "X255", "X558", "X2366", "X177", > >> + "X255.1"), class = "data.frame", row.names = c("aa", "bb", "cs", > >> + "de", "gh")) > >> > mydata$idx <- apply(mydata, 1, function(x)as.numeric(any(x == 2 & > >> > !is.na(x)))) > >> > mydata > >> X125 X255 X558 X2366 X177 X255.1 idx > >> aa 0 1 0 NA 0 0 0 > >> bb 1 1 0 NA 0 1 0 > >> cs 2 1 2 1 0 0 1 > >> de 0 1 0 NA 0 0 0 > >> gh 2 0 0 0 0 0 1 > >> > >> Sarah > >> > >> On Mon, Aug 10, 2015 at 4:11 PM, Lida Zeighami <lid.zigh at gmail.com> > wrote: > >>> > >>> Hi there, > >>> > >>> I have a matrix contain 0,1,2, NA elements. > >>> I want to add a column to this matrix with name of "idx" . then for > each > >>> row, I should put 1 in this column (idx) if there is at least one 2 in > >>> that > >>> row otherwise I should put 0 in this column! > >>> > >>> for example mydata: > >>> > >>> 125 255 558 2366 177 255 > >>> aa 0 1 0 NA 0 0 > >>> bb 1 1 0 NA 0 1 > >>> cs 2 1 2 1 0 0 > >>> de 0 1 0 NA 0 0 > >>> gh 2 0 0 0 0 0 > >>> > >>> > >>> my output should be: > >>> > >>> > >>> 125 255 558 2366 177 255 idx > >>> aa 0 1 0 NA 0 0 0 > >>> bb 1 1 0 NA 0 1 0 > >>> cs 2 1 2 1 0 0 1 > >>> de 0 1 0 NA 0 0 0 > >>> gh 2 0 0 2 0 2 1 > >>> >[[alternative HTML version deleted]]