Alexander.Herr at csiro.au
2016-Jul-25 01:30 UTC
[R] adding new values to dataframe based on existing values in two columns
Here is another solution using interaction, aggregate and merge: interaction(xyz[,1],xyz[,2])->nf #create a unique x.y grouping cbind(xyz[,1:2],nf) aggregate(xyz[,3],list(nf),min)->nmins names(nmins)<-c('nf','mins.1') xyz$nf<-nf merge(xyz,nmins, by='nf', all=TRUE)->nd head(nd) any other improvements? XXXXXXXXXXXXXXX Herry wrote XXXXXXXXXXXXXXXXXX Hiya, I am trying to assign minimum values to a dataframe based on existing columns. I can do this via loops, but surely R has much more elegant solutions... Here is my code: set.seed(666) xyz<-as.data.frame(cbind(x=rep(rpois(50,10),2)+1, y=rep(rpois(50,10),2)+1,z=runif(100, min=-3, max=40))) xyz[order(xyz[,1], xyz[,2]),]->xyz unique(xyz[,1:2]) dim(xyz) aggregate(xyz[,3],by=list(x=xyz[,1],y=xyz[,2]), min)->mins xyz$mins<-rep(NA, nrow(xyz)) #now assign min values to each xy combination for(i in unique(xyz[,1])) { mins[mins[,1]==i,]->mm for( j in unique(mm[,2])) { mins[mins[,1]==i & mins[,2] == j,3]->xyz[xyz[,1]==i & xyz[,2]==j,4] } } Thanks and cheers Herry