【问题标题】:Extract column and row name of minimum value per group提取每组最小值的列名和行名
【发布时间】:2019-07-16 13:08:05
【问题描述】:

我想提取具有最小值的列和行的名称,按物种名称分组。例如,如果 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)

我首先尝试了列名,但没有成功:

AIC.min<- df %>%
group_by(species) %>%
mutate(min.model = names(df[2:3])[apply(df[2:3],1,function(x) which(x==min(x)))])

我还尝试使用过滤器和选择,以及聚合而不是应用以下类似问题,但没有成功。没有一个对我有用,在这里我收到一条错误消息“名称错误(models.AIC.all[2:8])[apply(models.AIC.all[2:8], 1, function(x) which(x == : 无效的下标类型'list'"

任何人都可以建议将是令人难以置信的棒!

【问题讨论】:

  • 您是否意识到您正在创建一个matrix,并且所有数字都转换为字符串? (如果没有,请使用data.frame 代替cbind。)
  • 你需要lapply(split(df[3:4], df$species), function(x) which(x == min(as.matrix(x)), arr.ind = TRUE))
  • 请加AIC.min:object 'AIC.min' not found.
  • 如果您只需要列名,请尝试使用max.col stack(lapply(split(df[3:4], df$species), function(x) names(x)[max.col(-x, "first")]))

标签: r dplyr plyr


【解决方案1】:

您可以尝试gather() 对两列有值,然后mutate() 查找每个物种-周期配对的最低值,然后filter() 返回列。

df %>% gather(k,v,-period,-species) %>% 
  group_by(species) %>% mutate(low=ifelse(v==min(v),1,0)) %>% 
  filter(low==1)

# A tibble: 3 x 5
# Groups:   species [3]
  species period k         v   low
  <fct>   <fct>  <chr> <dbl> <dbl>
1 Ag      ow     V1        1     1
2 Au      pre    V1        3     1
3 Bri     post   V1        1     1

【讨论】:

  • 是的,这行得通!第一次尝试时犯了一个愚蠢的错误。我想我需要休息一下……谢谢一百万。顺便说一句,@akrun 方法也有效,这只是更直接地获得名称!
  • 这是因为您在将 4 个变量传递给 data.frame 之前对它们使用了 cbind,这会导致数值更改为字符串(即 '13' cbind 或mutate 的值列删除为数字。 df %&gt;% gather(k,v,-period,-species) %&gt;% mutate(v=as.numeric(v)) %&gt;% group_by(species) %&gt;% mutate(low=ifelse(v==min(v),1,0)) %&gt;% filter(low==1)
  • 是的,我意识到了!并修复它=)
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2014-10-17
  • 2013-03-22
  • 2020-12-16
相关资源
最近更新 更多