如何找到最小数量的几个变量并返回列名

时间:2014-11-18 07:41:47

标签: r dataframe min

我有一些像这样的数据

       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. 最小值的列名

  3. 即。结果应该是:

          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
    

    有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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提供)将是pmindo.callmax.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"))