R 提取每个组的最小值的列和行名称

R 提取每个组的最小值的列和行名称,r,dplyr,plyr,R,Dplyr,Plyr,我想用最小值提取列和行的名称,按物种名称分组。例如,如果DB是下面的示例,则结果将是物种Ag的V1(列名)和ow(行名),物种Au的V1和pre,物种Bri的V1和post species <- rep(c("Ag", "Au", "Bri"), each=4) period<- rep(c("ow", "pre", "fp", "post"), l=12) V1 <- c(1,3,5,10,18,3,15,6,3,3,46,1) V2 <- c(2,4,5,2,8,13

我想用最小值提取列和行的名称,按物种名称分组。例如,如果DB是下面的示例,则结果将是物种Ag的V1(列名)和ow(行名),物种Au的V1和pre,物种Bri的V1和post

species <- rep(c("Ag", "Au", "Bri"), each=4)
period<- rep(c("ow", "pre", "fp", "post"), l=12)
V1 <- c(1,3,5,10,18,3,15,6,3,3,46,1)
V2 <- c(2,4,5,2,8,13,5,98,54,34,56,11)
df<-data.frame(species, period, V1, V2)
species您可以尝试对具有值的两列进行
gather()
操作,然后
mutate()
查找每个物种周期对的最低值,然后
filter()
返回列

df%>%聚集(k,v,-周期,-物种)%>%
分组依据(物种)%>%突变(低=ifelse(v==min(v),1,0))%>%
过滤器(低==1)
#一个tibble:3x5
#类群:种[3]
物种周期k v低
1 Ag ow V1 1
2 Au V1前3 1
3 Bri post V1 1

您是否意识到您正在创建一个
矩阵
,并且所有数字都转换为字符串?(如果没有,请使用
data.frame
代替
cbind
)是否需要
lappy(拆分(df[3:4],df$species),函数(x)(x==min(as.matrix(x)),arr.ind=TRUE))
请添加AIC.min:
未找到对象“AIC.min”
。如果只需要列名,请尝试使用
max.col
堆栈(拆分(df[3:4],df$species),函数(x)名称(x)[max.col(-x,“first”))
是的,这很有效!!!第一次尝试时犯了一个愚蠢的错误。我想我需要休息一下…非常感谢。顺便说一句,@akrun方法也奏效了,这只是更直接地获得名称!这是因为在将4个变量传递到
data.frame
之前,您正在对它们使用
cbind
,这会导致数值更改为字符串(即,“13”cbind,或将值列变为数值<代码>df%%>%聚集(k,v,-周期,-物种)%%>%变异(v=as.numeric(v))%%>%groupby(物种)%%>%变异(low=ifelse(v==min(v),1,0))%%>%过滤器(low==1)是的,我意识到了!并修复了它=)
AIC.min<- df %>%
group_by(species) %>%
mutate(min.model = names(df[2:3])[apply(df[2:3],1,function(x) which(x==min(x)))])