R:根据R中的行值获取列名

时间:2016-08-20 18:16:00

标签: r

我有一个如下表格,想根据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

1 个答案:

答案 0 :(得分: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

这也可以通过melt进入'long'格式来完成,在基于'value'的'id'/ order分组之后对前两行进行子集化,然后加入{{1原始数据集

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