Hi all, I have the following data frame? dput(df) ? ??structure(list(Department = c("A", "A", "A", "A", "A", "A", "A",? "A", "B", "B", "B", "B", "B", "B", "B", "B"), Class = c(1L, 1L,? 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Value = c(0L,? 100L, 800L, 800L, 0L, 300L, 1200L, 1200L, 0L, 0L, 400L, 400L,? 200L, 800L, 1200L, 1200L)), class = "data.frame", row.names = c(NA,? -16L)) I would like to group by "Department" and "Class" and repeat the minimum value of "Valule" excluding zeros or get the second minimum value. The desired output is: ? ??dput(df) ? ??structure(list(Department = c("A", "A", "A", "A", "A", "A", "A",? "A", "B", "B", "B", "B", "B", "B", "B", "B"), Class = c(1L, 1L,? 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Value = c(0L,? 100L, 800L, 800L, 0L, 300L, 1200L, 1200L, 0L, 0L, 400L, 400L,? 200L, 800L, 1200L, 1200L), MinValue = c(100L, 100L, 100L, 100L,? 300L, 300L, 300L, 300L, 400L, 400L, 400L, 400L, 200L, 200L, 200L,? 200L)), class = "data.frame", row.names = c(NA, -16L)) ? ? how should I change the following dplyr to give me the desired output?? ? ?df <-? ? df %>% ? group_by(Department,Class) %>% ? mutate(MinValue=min(Value) ) Thanks for any help. Elahe
Homework? Try maybe mutate(MinValue = min(Value[Value != 0]) ) or mutate(MinValue = sort(unique(Value))[2]) Hth -- Gerrit --------------------------------------------------------------------- Dr. Gerrit Eichner Mathematical Institute, Room 212 gerrit.eichner at math.uni-giessen.de Justus-Liebig-University Giessen Tel: +49-(0)641-99-32104 Arndtstr. 2, 35392 Giessen, Germany http://www.uni-giessen.de/eichner --------------------------------------------------------------------- Am 11.05.2021 um 13:11 schrieb Elahe chalabi via R-help:> Hi all, > > I have the following data frame > > > dput(df) > ? ??structure(list(Department = c("A", "A", "A", "A", "A", "A", "A", > "A", "B", "B", "B", "B", "B", "B", "B", "B"), Class = c(1L, 1L, > 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Value = c(0L, > 100L, 800L, 800L, 0L, 300L, 1200L, 1200L, 0L, 0L, 400L, 400L, > 200L, 800L, 1200L, 1200L)), class = "data.frame", row.names = c(NA, > -16L)) > > > I would like to group by "Department" and "Class" and repeat the minimum value of "Valule" excluding zeros or get the second minimum value. The desired output is: > > > ? ??dput(df) > ? ??structure(list(Department = c("A", "A", "A", "A", "A", "A", "A", > "A", "B", "B", "B", "B", "B", "B", "B", "B"), Class = c(1L, 1L, > 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Value = c(0L, > 100L, 800L, 800L, 0L, 300L, 1200L, 1200L, 0L, 0L, 400L, 400L, > 200L, 800L, 1200L, 1200L), MinValue = c(100L, 100L, 100L, 100L, > 300L, 300L, 300L, 300L, 400L, 400L, 400L, 400L, 200L, 200L, 200L, > 200L)), class = "data.frame", row.names = c(NA, -16L)) > > > how should I change the following dplyr to give me the desired output? > > > ? ?df <- > ? df %>% > ? group_by(Department,Class) %>% > ? mutate(MinValue=min(Value) ) > > > Thanks for any help. > Elahe > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. >
Hello, This can be done by getting the min of Value[Value != 0]. In the code that follows I have named the expected output df2 and assigned the result to df3 and df4. library(dplyr) df3 <- df %>% group_by(Department,Class) %>% mutate(flag = Value != 0, MinValue = min(Value[flag]) ) %>% select(-flag) identical(df2$MinValue, df3$MinValue) #[1] TRUE Or, simpler: df4 <- df %>% group_by(Department,Class) %>% mutate(MinValue = min(Value[Value != 0]) ) identical(df2$MinValue, df4$MinValue) #[1] TRUE Hope this helps, Rui Barradas ?s 12:11 de 11/05/21, Elahe chalabi via R-help escreveu:> Hi all, > > I have the following data frame > > > dput(df) > ? ??structure(list(Department = c("A", "A", "A", "A", "A", "A", "A", > "A", "B", "B", "B", "B", "B", "B", "B", "B"), Class = c(1L, 1L, > 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Value = c(0L, > 100L, 800L, 800L, 0L, 300L, 1200L, 1200L, 0L, 0L, 400L, 400L, > 200L, 800L, 1200L, 1200L)), class = "data.frame", row.names = c(NA, > -16L)) > > > I would like to group by "Department" and "Class" and repeat the minimum value of "Valule" excluding zeros or get the second minimum value. The desired output is: > > > ? ??dput(df) > ? ??structure(list(Department = c("A", "A", "A", "A", "A", "A", "A", > "A", "B", "B", "B", "B", "B", "B", "B", "B"), Class = c(1L, 1L, > 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Value = c(0L, > 100L, 800L, 800L, 0L, 300L, 1200L, 1200L, 0L, 0L, 400L, 400L, > 200L, 800L, 1200L, 1200L), MinValue = c(100L, 100L, 100L, 100L, > 300L, 300L, 300L, 300L, 400L, 400L, 400L, 400L, 200L, 200L, 200L, > 200L)), class = "data.frame", row.names = c(NA, -16L)) > > > how should I change the following dplyr to give me the desired output? > > > ? ?df <- > ? df %>% > ? group_by(Department,Class) %>% > ? mutate(MinValue=min(Value) ) > > > Thanks for any help. > Elahe > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. >