【问题标题】:A Function chooses the maximum value among values in two or more labels函数在两个或多个标签中的值中选择最大值
【发布时间】:2025-12-02 20:30:01
【问题描述】:

这是虚拟数据

df=structure(list(group1 = c("0.1531181", "0.1537821", "0.284066", 
"0.7549542", "0.2495559"), group2 = c("0.3116818", "0.5837542", 
"0.430886", "0.7856033", "0.6351635"), group3 = c(7.80191002743109e-17, 
2.22008198884117e-49, 4.64379480824993e-13, 0.0476184338005978, 
2.2062018808144e-39)), row.names = c("C4orf39", "FAM89A", "FMNL1", 
"CYB5R2", "CHST2"), class = "data.frame")

如您所见,“df”包含三列:group1、group2 和 group3。每一行都是基因名称。

现在我想在 R 中构建一个函数,以便它自动确定任一列中的哪个值是最大值,并将组号分配给新列“GeneCluster”。最终结果如下:

------------------group1----------group2------------基因簇

基因1-----------(0.8)---------------(0.7)-------------- -------1

基因2----------(-0.4)--------------(0.25)-------------- -----2

当然列(组)的数量可以是2个或更多。

任何帮助将不胜感激!

【问题讨论】:

    标签: r algorithm


    【解决方案1】:

    给你,不得不把这个例子弄得乱七八糟

    library(tidyverse)
    df = structure(list(`group1` = c("0.1531181", "1", 
                                     "0.284066", "0.7549542", "0.2495559"), `group2` = c("0.3116818", 
                                                                                         "0.5837542", "0.430886", "0.7856033", "0.6351635")), row.names = c("C4orf39", 
                                                                                                                                                            "FAM89A", "FMNL1", "CYB5R2", "CHST2"), class = "data.frame")
    
    
    
    df %>% 
      mutate(GeneCluster = if_else(group1 > group2,1,2))
    

    这是我的第二次尝试应该足够笼统

    set.seed(42)
    df %>% 
      mutate_all(as.numeric) %>% 
      mutate(group3 = group2 * rnorm(5) + .5,
             row = row_number()) %>%
      pivot_longer(-row) %>% 
      group_by(row) %>% 
      mutate(max_value = max(value),
             group_number = str_extract(name,"[:digit:]") %>% as.numeric(),
             group_max_value = if_else(value == max_value ,group_number,NA_real_)) %>%
      fill(group_max_value,.direction = c("updown")) %>%
      select(-group_number,-max_value) %>% 
      pivot_wider(names_from = name,values_from = value)
    

    这是使用新版本 dplyr 的新解决方案

    df %>% 
      mutate(across(everything(),as.numeric)) %>% 
      rowwise() %>% 
      mutate(result = c_across(contains("group")) %>% which.max())
    

    【讨论】:

    • 是的,其实我也有同样的解决方案。但问题是,我正在尝试构建一个函数来自动执行此任务,这意味着列数可以是 3,4,.. 或更多
    • 哦,好的,请尝试更改示例以包含第三列
    • 嘿布鲁诺,我已经修复了主要问题中的“df”。请在您的 R 环境中再次复制 -paste
    • 嘿#Bruno,非常感谢您的帮助。我需要很长时间才能理解您的代码行,但没关系。我会尽力做到这一点(y)再次感谢
    • 没问题任何问题都可以随时提出,也可以查看 rstudio 上的 f1 按钮以获取功能文档或?功能