【问题标题】:Add a new column to a dataframe based on results from other columns根据其他列的结果向数据框添加新列
【发布时间】:2019-03-12 10:57:14
【问题描述】:

我对 R 很陌生,所以我希望我的问题会很有趣。我想做的很简单。这是我的数据集的示例:

> head(belongliness)
   ACTIVITY_X ACTIVITY_Y ACTIVITY_Z   Event  cluster1    cluster2     cluster3    cluster4
1:         40         47         62 Head-up 0.1900989 0.768225365 0.0160654667 0.025610279
2:         60         74         95 Head-up 0.5392218 0.038558310 0.0064671635 0.415752686
3:         62         63         88 Head-up 0.7953673 0.044981152 0.0067121719 0.152939414
4:         60         56         82 Head-up 0.9941016 0.002608879 0.0003007537 0.002988748
5:         66         61         90 Head-up 0.7027407 0.048318016 0.0079239680 0.241017291
6:         60         53         80 Head-up 0.9541378 0.023338896 0.0024442116 0.020079071

我想在"cluster 4" 列的右侧创建一个新列"winning cluster"。列"winning cluster" 将为每一行取列"cluster 1""cluster 4" 中的最大值,并显示该列的索引名称。

对于第 1 行,cluster 2,对于第 2 行 cluster 1,对于第 3 行 cluster 1 等等。

感谢任何帮助!

【问题讨论】:

  • 试试belongliness[, winning_cluster := do.call(pmax, .SD), .SDcols = paste0("cluster", 1:4)](好像是data.table)。如果是data.frame belongliness$winng_cluster <- do.call(pmax, belongliness[grep("^cluster", names(belongliness))])
  • 我使用了您的第一个选项:results<-belongliness[, winning_cluster := do.call(pmax, .SD), .SDcols = paste0("cluster", 1:4)] View(results) 但是这将显示每一行的最大值,而不是值标题的列名称。我清楚了吗?
  • 你想要列的名称,然后使用max.col,即names(bellongliness)[max.col(belongliness[grep("^cluster", names(belongliness))])]
  • @juansalix。我用给出的例子发布了一个对我来说很好的版本

标签: r


【解决方案1】:

如果数据集是data.table类,在.SDcols指定感兴趣的列,用max.col获取每行中最高值的列索引,用它来选择列名并分配(@987654324 @) 作为 'winning_cluster'

library(data.table)
belongliness[, winning_cluster := names(.SD)[max.col(.SD)], 
           .SDcols = cluster1:cluster4]

【讨论】:

    【解决方案2】:

    在基本的 R 中,这很容易做到:

    belongliness$`winning cluster` = apply(belongliness[,5:8], 1, max)
    

    其中belongliness[,5:8] 对应于列cluster1cluster4

    或者如果你想要索引,

    belongliness$`winning cluster` = apply(belongliness[,5:8], 1, which.max)
    belongliness$`winning cluster` = paste0('cluster', belongliness$`winning cluster`)
    

    编辑:第一行右侧实质上是max.col

    belongliness$`winning cluster` = max.col(belongliness[,5:8])
    

    【讨论】:

      猜你喜欢
      • 2019-04-04
      • 2017-01-14
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 2018-10-11
      • 2022-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多