Suppose I have a simple dataframe like this one:
mydata <- data.frame(Name = c(rep("A",4),rep("B",3),rep("C",2),rep("D",2),"E"),
Value = c(5,2,3,6,1,3,8,13,3,5,3,3)
I want to find which is the minimum Value that is shared by all Name (in this example, 3). So far I've created a column with the minimum Value for each Name with:
mydata$min <- ave(mydata$Value, mydata$Name, FUN = min)
but it's not the result I am looking for. I think I can group the Name with a combination of unique() and mutate() (from dplyr) but I am not sure.
CodePudding user response:
We split the 'Value' by the 'Name' get the intersect using Reduce and apply min on it
mydata$min <- min(Reduce(intersect, split(mydata$Value, mydata$Name)))
Or with dplyr
library(dplyr)
mydata %>%
group_by(Value) %>%
mutate(flag = n_distinct(Name) == n_distinct(mydata$Name)) %>%
ungroup %>%
mutate(Min = min(Value[flag]), flag = NULL)
CodePudding user response:
You can find the result by first building each group's vector of doubles, then finding the intersect of the vectors, and finally extracting the minimum value.
Using the tidyverse you can do so with:
library(dplyr)
library(purrr)
mydata <- data.frame(
Name = c(rep("A", 4), rep("B", 3), rep("C", 2), rep("D", 2), "E"),
Value = c(5, 2, 3, 6, 1, 3, 8, 13, 3, 5, 3, 3)
)
mydata %>%
group_by(Name) %>%
summarize(Values = list(Value)) %>%
pull(Values) %>%
reduce(intersect) %>%
min()
