【问题标题】:How to find the smallest number of several variables and return the column name如何找到几个变量中的最小数量并返回列名
【发布时间】:2015-01-15 07:52:44
【问题描述】:

我有一些这样的数据

       A    B    C    D
[1,]  23   23   12   34
[2,]  12   13   11   9 
[3,]  70   80   67   76
[4,]  43   23   25   40

我想生成两个新变量。

  1. 每行的最小数

  2. 最小值的列名

即结果应该是这样的:

      A     B    C     D   min   minCol
1    23    23   12    34    12        C
2    12    13   11     9     9        D
3    70    80   67    76    67        C
4    43    23   25    40    23        B

我尝试了下面的脚本,我确实得到了“min”变量,但是,当我尝试生成“minCol”时,一些值被记为“min”,而不是 A,B, C 或 D。

data <- transform(data, min=apply(data[,c(1:4)],1, min,na.rm = TRUE))

运行后,我得到了下面的数据框,这很好。

      A     B    C     D   min   
1    23    23   12    34    12       
2    12    13   11     9     9        
3    70    80   67    76    67        
4    43    23   25    40    23        

然后我运行下面的脚本

data <- data.frame(data, minCol= apply(data, 1, function(row)
        {colnames(data)[[which.min(row)]]}))

得到了这样的东西

      A     B    C     D   min   minCol
1    23    23   12    34    12        C
2    12    13   11     9     9        D
3    70    80   67    76    67        C
4    43    23   25    40    23        min

有人可以帮忙吗?

【问题讨论】:

    标签: r dataframe min


    【解决方案1】:

    一种简单的方法是(假设您的数据名为df)

    df[c("min", "minCol")] <- t(apply(df, 1, function(x) c(min(x), names(x[which.min(x)]))))
    df
    #    A  B  C  D min minCol
    # 1 23 23 12 34  12      C
    # 2 12 13 11  9   9      D
    # 3 70 80 67 76  67      C
    # 4 43 23 25 40  23      B
    

    另一种方法(由@akrun 提供)是pmin、do.call 和max.col 的组合

    val <- do.call(pmin, c(df, na.rm = TRUE)) 
    transform(df, min=val, minCol = names(df)[max.col(df == val, 'first')])
    

    数据

    df <- structure(list(A = c(23L, 12L, 70L, 43L), B = c(23L, 13L, 80L, 
          23L), C = c(12L, 11L, 67L, 25L), D = c(34L, 9L, 76L, 40L)), .Names = c("A", 
          "B", "C", "D"), class = "data.frame", row.names = c("1", "2", 
          "3", "4"))
    

    【讨论】:

    • 谢谢。但是当我使用这个脚本时,R 给了我一个列表而不是一个数据框。如果我在运行我的脚本后运行这个脚本,还有更多的值是“min”。
    • 我已经添加了我用过的数据集。这不就是你的吗?
    • 我已经编辑了我的问题,我一开始拥有的数据集可能与您提供的格式不同。
    • 好的,cbind(data, t(apply(data, 1, function(x) c(min(x), names(x[which.min(x)]))))) 给你什么?请注意,如果您有一个matrix 结构,您将不能同时拥有numeric 和character 类型的列,而是它们都变成character。我强烈建议使用data &lt;- as.data.frame(data) 将您的数据集转换为data.frame,然后使用我原始答案中提供的方法
    • 我将数据集转换为data.frame后得到了结果,并使用您提供的第一种方法。还有一件事,我在 data.frame 中得到了“NA”,对于那些“NA”,R 在“minCol”变量中返回“min”或“minCol”。它可以返回“NA”吗?
    猜你喜欢
    • 2012-09-08
    • 2020-09-18
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多