Hi, You may try this: vec1<-unique(data1[,1]) res<-do.call(rbind,lapply(seq_along(vec1),function(i) {x1<-data1[data1[,1]%in%vec1[-i],]; x2<-mean(x1$value[x1$value>0]); x3<- data1[data1[,1]%in% vec1[i],]; x3$value[x3$value<0]<-x3$value[x3$value<0]+x2; x3})) res1<-res[match(row.names(dat1),row.names(res)),] A.K. My example dataset is below. data1<-structure(list(Group = c("c", "c", "b", "e", "b", "b", "e", "b", "b", "c", "b", "c", "d", "e", "a", "c", "e", "e", "b", "c", "e", "a", "b", "c", "a", "d", "c", "a", "c", "d"), value = c(1.65766756554083, -1.00159810943707, 0.828016940090355, -0.0942360302636258, 0.110184789532348, 0.501357929769482, -0.843610465892682, 0.112544248337201, 0.83530947271874, 1.54896291279315, -0.668032450079063, -0.328748306664628, -0.15429551998755, 1.58892084606551, -0.45892429914377, -2.15596722591948, 0.898111157005135, -0.287228845053069, -1.54706640415041, -0.780803473387221, 1.54955826561218, -0.506014575029359, -1.66808530086564, -0.845467401060001, 1.92688611565505, 0.46643424929481, 0.293821259924534, 0.151536430922866, -1.62429048404794, 0.444694790051071)), .Names = c("Group", "value"), row.names = c(NA, -30L), class = "data.frame") Here, i need to change the negative values by adding with the mean of the positive values. ?The condition is that the mean of the positive values should exclude the positive values on the group on which this is carried out. ?For example, the 'a' group negative values should be added with the mean from the positive values from groups 'c","d',"e","b". ?Similarly for other groups. Thanks.