Daisy Englert Duursma
2011-Jan-27 05:36 UTC
[R] identifying when one element of a row has a positive number
Hello, I am not sure where to begin with this problem or what to search for in r-help. I just don't know what to call this. If I have 5 columns, the first 2 are the x,y, locations and the last three are variables about those locations. x<-seq(1860,1950,by=10) y<-seq(-290,-200,by=10) ANN<-c(3,0,0,0,1,0,1,1,0,0) CTA<-c(0,1,0,0,0,0,1,0,0,2) GLM<-c(0,0,2,0,0,0,0,1,0,0) df1<-as.data.frame(cbind(x,y,ANN,CTA,GLM)) What I would like to produce is an additional column that tells when only 1 of the three variables has a value greater than 0. I would like this new column to give the name of the variable. Likewise, I would like a column that tells one only one of the three variables for a given row has a value of 0. For my example the new columns would be: one_presence<-c("ANN","CTA","GLM","NA","ANN","NA","NA","NA","NA","CTA") one_absence<-c("NA","NA","NA","NA","NA","NA","GLM","CTA","NA","NA") The end result should look like df2<-(cbind(df1,one_presence,one_absence)) I am sure I can do this with a loop or maybe grep but I am out of ideas. Any help would be appreciated. Cheers, Daisy -- Daisy Englert Duursma Room E8C156 Dept. Biological Sciences Macquarie University? NSW? 2109 Australia
Peter Langfelder
2011-Jan-27 06:05 UTC
[R] identifying when one element of a row has a positive number
Here's a solution., maybe not the most elegant but works. df.r = df1[, c(3:5)]; # restricted data nNonZero = apply(df.r!=0, 1, sum); one = nNonZero==1; oneZero = nNonZero==2; whichOne = apply(df.r[one, ]!=0, 1, which); whichZero = apply(df.r[oneZero, ]==0, 1, which); colNames = colnames(df.r); one_presence = one_absence = rep(NA, nrow(df1)) one_presence[one] = colNames[whichOne]; one_absence[oneZero] = colNames[whichZero]; Peter On Wed, Jan 26, 2011 at 9:36 PM, Daisy Englert Duursma <daisy.duursma at gmail.com> wrote:> Hello, > > I am not sure where to begin with this problem or what to search for > in r-help. I just don't know what to call this. > > If I have 5 columns, the first 2 are the x,y, locations and the last > three are variables about those locations. > > x<-seq(1860,1950,by=10) > y<-seq(-290,-200,by=10) > ANN<-c(3,0,0,0,1,0,1,1,0,0) > CTA<-c(0,1,0,0,0,0,1,0,0,2) > GLM<-c(0,0,2,0,0,0,0,1,0,0) > df1<-as.data.frame(cbind(x,y,ANN,CTA,GLM)) > > What I would like to produce is an additional column that tells when > only 1 of the three variables has a value greater than 0. I would like > this new column to give the name of the variable. Likewise, I would > like a column that tells one only one of the three variables for a > given row has a value of 0. For my example the new columns would be: > > one_presence<-c("ANN","CTA","GLM","NA","ANN","NA","NA","NA","NA","CTA") > one_absence<-c("NA","NA","NA","NA","NA","NA","GLM","CTA","NA","NA") > > The end result should look like > > df2<-(cbind(df1,one_presence,one_absence)) > > I am sure I can do this with a loop or maybe grep but I am out of ideas. > > Any help would be appreciated. > > Cheers, > Daisy > > -- > Daisy Englert Duursma > > Room E8C156 > Dept. Biological Sciences > Macquarie University? NSW? 2109 > Australia > > ______________________________________________ > 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. >
Dennis Murphy
2011-Jan-27 08:36 UTC
[R] identifying when one element of a row has a positive number
Hi: Try this: f <- function(x) ifelse(sum(x > 0) == 1L, names(which(x > 0)), NA) g <- function(x) ifelse(sum(x > 0) == 2L, names(which(x == 0L)), NA)> apply(df1[, 3:5], 1, f)[1] "ANN" "CTA" "GLM" NA "ANN" NA NA NA NA "CTA"> apply(df1[, 3:5], 1, g)[1] NA NA NA NA NA NA "GLM" "CTA" NA NA HTH, Dennis On Wed, Jan 26, 2011 at 9:36 PM, Daisy Englert Duursma < daisy.duursma@gmail.com> wrote:> Hello, > > I am not sure where to begin with this problem or what to search for > in r-help. I just don't know what to call this. > > If I have 5 columns, the first 2 are the x,y, locations and the last > three are variables about those locations. > > x<-seq(1860,1950,by=10) > y<-seq(-290,-200,by=10) > ANN<-c(3,0,0,0,1,0,1,1,0,0) > CTA<-c(0,1,0,0,0,0,1,0,0,2) > GLM<-c(0,0,2,0,0,0,0,1,0,0) > df1<-as.data.frame(cbind(x,y,ANN,CTA,GLM)) > > What I would like to produce is an additional column that tells when > only 1 of the three variables has a value greater than 0. I would like > this new column to give the name of the variable. Likewise, I would > like a column that tells one only one of the three variables for a > given row has a value of 0. For my example the new columns would be: > > one_presence<-c("ANN","CTA","GLM","NA","ANN","NA","NA","NA","NA","CTA") > one_absence<-c("NA","NA","NA","NA","NA","NA","GLM","CTA","NA","NA") > > The end result should look like > > df2<-(cbind(df1,one_presence,one_absence)) > > I am sure I can do this with a loop or maybe grep but I am out of ideas. > > Any help would be appreciated. > > Cheers, > Daisy > > -- > Daisy Englert Duursma > > Room E8C156 > Dept. Biological Sciences > Macquarie University NSW 2109 > Australia > > ______________________________________________ > 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. >[[alternative HTML version deleted]]