【问题标题】:Creating New Column with Maximum Value创建具有最大值的新列
【发布时间】:2021-02-24 22:26:32
【问题描述】:

我花了很多时间研究这个主题,但找不到太多。我想要一个名为“Max Region”的新数据列,它给出了每行中出现最大值的列的名称。

df <- data.frame(Head=c(9, 6, 2, NA), Thorax=c(9, 2, NA, NA), Abdomen=c(NA, NA, 5, 5), Neck=c(4, 3, 5, 2))

#  Head Thorax Abdomen Neck
#    9      9      NA    4
#    6      2      NA    3
#    2     NA       5    5
#   NA     NA       5    2

到目前为止,我已经使用过:

df$MaxRegion <- names(df)[apply(df, 1, which.max)]

但是,在平局的情况下,我真的希望两列都产生结果(即 HeadThorax 或 AbdomenNeck),或者只产生“NA”。 which.max 可以做到这一点吗?我也研究了 max.col,但它似乎也没有这个功能。非常感谢!

【问题讨论】:

    标签: r max


    【解决方案1】:

    使用 OP 的代码,如果我们需要获取所有绑定的 max 元素列名,请在 maxpaste 上使用 %in%(在有 NA 时返回 FALSE)或 ==对应names

    apply(df, 1, function(x) toString(names(x)[x %in% max(x, na.rm = TRUE)]))
    #[1] "Head, Thorax"  "Head"          "Abdomen, Neck" "Abdomen"  
    

    注意:which.max 仅返回 max 值的第一个索引

    【讨论】:

    • 太好了,非常感谢。我怎样才能把它放到一个新的专栏里?我试过:df$MaxRegion
    • @krazyglue5 你只需要df$MaxRegion &lt;- apply(df, 1, function(x) toString(names(x)[x %in% max(x, na.rm = TRUE)]))。我们已经在apply 中对names 进行子集化
    【解决方案2】:

    另一个基本 R 选项

    df$MaxRegion <- mapply(
      subset,
      list(names(df)),
      asplit(df == do.call(pmax, c(df, na.rm = TRUE)), 1)
    )
    

    给予

    > df
      Head Thorax Abdomen Neck     MaxRegion
    1    9      9      NA    4  Head, Thorax
    2    6      2      NA    3          Head
    3    2     NA       5    5 Abdomen, Neck
    4   NA     NA       5    2       Abdomen
    

    【讨论】:

      猜你喜欢
      • 2018-09-10
      • 2020-06-08
      • 1970-01-01
      • 2019-02-07
      • 2021-11-30
      • 2021-03-23
      • 2022-10-13
      • 2018-08-15
      • 1970-01-01
      相关资源
      最近更新 更多