【问题标题】:R: Get column name based on row values in RR:根据R中的行值获取列名
【发布时间】:2016-08-20 18:15:59
【问题描述】:

我有一个如下表,想根据 R 中的行值创建建议。

这就是我所拥有的 -

id  class1  class2  class3  class4
A   0.98    0.48    0.21    0.99
B   0.22    0.31    0.41    0.11
C   0.70    0.81    0.61    0.21

我想要两个新列('sugg1'、'sugg2'),它们将为每一行给出两个最高最大值的列名,即第一行,0.99 是最大值,所以它对应列名是class4,下一个最大值是0.98,列名是class1

id  class1  class2  class3  class4  sugg1   sugg2
A   0.98    0.48    0.21    0.99    class4  class1
B   0.22    0.31    0.41    0.11    class3  class2
C   0.70    0.81    0.61    0.21    class2  class1

【问题讨论】:

  • 类列的最大值为 sugg1,次佳为 sugg2

标签: r


【解决方案1】:

我们可以使用 applyMARGIN = 1 循环遍历行,sort 行中的值递减,得到前 2 个(head(...)),转置输出并在原始列中创建两个新列数据集。

df1[paste0("sugg", 1:2)] <- t(apply(df1[-1], 1, FUN = function(x) names(head(sort(-x),2))))

df1
#  id class1 class2 class3 class4  sugg1  sugg2
#1  A   0.98   0.48   0.21   0.99 class4 class1
#2  B   0.22   0.31   0.41   0.11 class3 class2
#3  C   0.70   0.81   0.61   0.21 class2 class1

这也可以通过melting 成'long'格式,根据'value'按'id'/ordering分组后的前两行子集,然后加入on原始数据集

library(data.table)#v1.9.7+
df1[dcast(melt(df1, id.var = "id")[order(-value), head(variable,2) , 
       id], id ~paste0("sugg", rowid(id)), value.var = "V1"), on = "id"]
#   id class1 class2 class3 class4  sugg1  sugg2
#1:  A   0.98   0.48   0.21   0.99 class4 class1
#2:  B   0.22   0.31   0.41   0.11 class3 class2
#3:  C   0.70   0.81   0.61   0.21 class2 class1

数据

df1 <- structure(list(id = c("A", "B", "C"), class1 = c(0.98, 0.22, 
0.7), class2 = c(0.48, 0.31, 0.81), class3 = c(0.21, 0.41, 0.61
), class4 = c(0.99, 0.11, 0.21)), .Names = c("id", "class1", 
"class2", "class3", "class4"), class = "data.frame",
row.names = c(NA, -3L))

【讨论】:

  • 简短而简单..让我试试这个:)
  • 太棒了!由于转置细节:) 一种想法,为什么apply() 会产生列明智的。它是默认的吗?还是这次你想要每行有两个值?
  • @SowmyaS.Manian 感谢您的客气话。是的,使用MARGIN = 1,行/列被转置,我们在分配给新列之前将其转回。
  • @SowmyaS.Manian 另外,您可以检查here 的转置问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2012-12-22
相关资源
最近更新 更多