我有一个如下所示的数据集:
ID A B C
1 150529 148914 60277
2 328122 330293 531977
3 74310 78129 34038
4 97520 104695 55268
我正在尝试评估每一行并确定最高的数字,并在此数据集中创建一个新列,并提供答案,以便我可以在此基础上继续聚合。
我创建了一个如下所示的函数:
winner <-function(a, b, c){
if (a>b & a>c)
{return("blue")}
else if(b>a & b>c)
{return("red")}
else
{return("yellow")}
}
如果我在命令行中运行它,但是如果以下列形式使用它,则该函数有效:
res <- transform(res, newcol=winner(PAN,PRI,PRD))
我收到如下所示的错误,newcol获取所有行的值“blue”:
Warning message:
In if (a > b & a > c) { :
the condition has length > 1 and only the first element will be used
答案 0 :(得分:4)
感谢所有人,@ alexis_laz给出了我的问题的确切解决方案。
我已将代码更改为:
res <- transform(res, newcol=c("blue", "red", "yellow")[max.col(res[-1])])
它按预期工作,给出了正确的结果。 再次感谢所有人!
答案 1 :(得分:2)
尝试:
transform(res, newcol=apply(res[-1],1,max))
# ID A B C newcol
#1 1 150529 148914 60277 150529
#2 2 328122 330293 531977 531977
#3 3 74310 78129 34038 78129
#4 4 97520 104695 55268 104695
此解决方案也快于apply
:
transform(res, newcol=do.call(pmax, res[-1]))