Skip to content

Instantly share code, notes, and snippets.

@aammd
Last active August 29, 2015 14:04
Show Gist options
  • Save aammd/bfd62a49d5ab687db0d1 to your computer and use it in GitHub Desktop.
Save aammd/bfd62a49d5ab687db0d1 to your computer and use it in GitHub Desktop.
values <- c(2,5,3,6,7,
9,5,4,9,9,
1,5,4,8,1,
3,1,5,6,2,
2,9,4,7,4)
my.mat <- matrix(values, nrow = 5, byrow = TRUE)
library(dplyr)
library(tidyr)
colmins <- lapply(1:ncol(my.mat),function(s){col <- my.mat[,s,drop = FALSE]
which(col == min(col), arr.ind = TRUE)}
)
cs_pos <- data.frame(name = rep(paste0("c",1:ncol(my.mat)),
times = sapply(colmins,nrow)),
do.call(rbind,colmins),
stringsAsFactors = FALSE)
rowmins <- lapply(1:nrow(my.mat),function(s){row <- my.mat[s,,drop = FALSE]
which(row == min(row), arr.ind = TRUE)}
)
rs_pos <- data.frame(name = rep(paste0("r",1:nrow(my.mat)),
times = sapply(rowmins,nrow)),
do.call(rbind,rowmins),
stringsAsFactors = FALSE)
cs_val <- data.frame(type = "c", name = paste0("c",1:ncol(my.mat)),
val = apply(my.mat,2,min),
stringsAsFactors = FALSE)
rs_val <- data.frame(type = "r", name = paste0("r",1:ncol(my.mat)),val = apply(my.mat,1,min),
stringsAsFactors = FALSE)
cs <- cs_pos %>%
mutate(col = col + (extract_numeric(name)-1)) %>%
left_join(cs_val)
rs <- rs_pos %>%
mutate(row = row + (extract_numeric(name)-1)) %>%
left_join(rs_val)
my.df <- rbind(cs,rs)
findpairs <- function(var) xor(duplicated(var,incomparables = NA),
duplicated(var,fromLast = TRUE,incomparables = NA))
my.df.dup <- my.df %>%
mutate(coord = paste(row,col,sep = ",")) %>%
select(coord,name,type) %>%
spread(type,name) %>%
mutate(cdup = findpairs(c),
rdup = findpairs(r)) %>%
group_by(coord) %>%
mutate(nval = sum(!is.na(c),!is.na(r)),
dup = any(cdup,rdup)) %>%
mutate(grp = ifelse(nval == 1 & !dup, 1, 0),
grp = ifelse(nval == 1 & dup, 2, grp),
grp = ifelse(nval == 2 & !dup, 3, grp),
grp = ifelse(nval == 2 & dup, 4, grp)) %>%
arrange(grp) %>%
select(coord,c,r,grp)
## nval = 1, dup = FALSE : unique minima
## nval = 1, dup = TRUE : duplicated minima, unshared
## nval = 2, dup = FALSE : a row-column pair
## nval = 2, dup = TRUE : >=2 columns share minima with a row (or vice-versa)
my.df.not4 <- my.df.dup %>%
filter(grp != 4) %>%
ungroup %>%
filter(!(grp == 2 & duplicated(c)))
my.df.4 <- my.df.dup %>%
ungroup %>%
filter(grp == 4) %>%
group_by(c) %>%
mutate(c_new = ifelse(sample(!duplicated(c)),c,NA)) %>%
ungroup %>%
group_by(r) %>%
mutate(r_new = ifelse(sample(!duplicated(r)),r,NA)) %>%
ungroup %>%
select(coord, c = c_new, r = r_new)
my.df.names <- rbind(my.df.not4,my.df.4) %>%
gather(type,name,c:r,na.rm = TRUE) %>%
group_by(coord) %>%
mutate(size = n(),
name = ifelse(size == 2, paste(name,collapse = ","), name)) %>%
select(coord,name) %>%
ungroup
my.df.mins <- my.df %>%
mutate(coord = paste(row,col,sep = ",")) %>%
select(coord,val) %>%
arrange(val %>% desc) %>%
ungroup
output <- left_join(data.frame(my.df.names),my.df.mins) %>%
unique %>%
arrange(desc(val)) %>%
group_by(val) %>%
mutate(namesamp = sample(name))
output$namesamp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment