我有一个如下表格,想根据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
答案 0 :(得分:1)
我们可以使用apply
与MARGIN = 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