我有一个data.frame,如下所示。对于name
列中的每组不同值,我想要颠倒ID
列的顺序。我不想触摸其余的列。我的数据非常庞大。我应该如何有效地做到这一点?R:只根据另一列更改少量列的顺序
ID=c(466,469,471,480,509,513,515,517,518,519,520,521,453,455,463,474,477,479,481,482,484,489,496,497,500,503)
name=c(rep("a",12),rep("b",14))
start=c(rep("2/13/2013",12),rep("3/6/2013",14))
end=c(rep("2/20/2013",12),rep("3/13/2013",14))
start=as.Date(start,"%m/%d/%Y")
end=as.Date(end,"%m/%d/%Y")
maint=data.frame(ID,name,start,end)
数据看起来像下面
ID name start end
466 a 2/13/2013 2/20/2013
469 a 2/13/2013 2/20/2013
471 a 2/13/2013 2/20/2013
480 a 2/13/2013 2/20/2013
509 a 2/13/2013 2/20/2013
513 a 2/13/2013 2/20/2013
515 a 2/13/2013 2/20/2013
517 a 2/13/2013 2/20/2013
518 a 2/13/2013 2/20/2013
519 a 2/13/2013 2/20/2013
520 a 2/13/2013 2/20/2013
521 a 2/13/2013 2/20/2013
453 b 3/6/2013 3/13/2013
455 b 3/6/2013 3/13/2013
463 b 3/6/2013 3/13/2013
474 b 3/6/2013 3/13/2013
477 b 3/6/2013 3/13/2013
479 b 3/6/2013 3/13/2013
481 b 3/6/2013 3/13/2013
482 b 3/6/2013 3/13/2013
484 b 3/6/2013 3/13/2013
489 b 3/6/2013 3/13/2013
496 b 3/6/2013 3/13/2013
497 b 3/6/2013 3/13/2013
500 b 3/6/2013 3/13/2013
503 b 3/6/2013 3/13/2013
最终数据应该如下
ID name start end
521 a 2/13/2013 2/20/2013
520 a 2/13/2013 2/20/2013
519 a 2/13/2013 2/20/2013
518 a 2/13/2013 2/20/2013
517 a 2/13/2013 2/20/2013
515 a 2/13/2013 2/20/2013
513 a 2/13/2013 2/20/2013
509 a 2/13/2013 2/20/2013
480 a 2/13/2013 2/20/2013
471 a 2/13/2013 2/20/2013
469 a 2/13/2013 2/20/2013
466 a 2/13/2013 2/20/2013
503 b 3/6/2013 3/13/2013
500 b 3/6/2013 3/13/2013
497 b 3/6/2013 3/13/2013
496 b 3/6/2013 3/13/2013
489 b 3/6/2013 3/13/2013
484 b 3/6/2013 3/13/2013
482 b 3/6/2013 3/13/2013
481 b 3/6/2013 3/13/2013
479 b 3/6/2013 3/13/2013
477 b 3/6/2013 3/13/2013
474 b 3/6/2013 3/13/2013
463 b 3/6/2013 3/13/2013
455 b 3/6/2013 3/13/2013
453 b 3/6/2013 3/13/2013
在你的情况,你可以,也许只是做'维护[顺序(MAINT $名称,-maint $ ID),]'或'data.table :: setorder (maint,name,-ID)'如果你需要效率。或者用'(maint,ave(ID,name,FUN = function(x)sort(x,decrease = TRUE)))' –
我不确定第一个建议是否可行。因为它将排序开始和结束日期字段,因为我们按降序对ID进行排序 – user2543622
在这种情况下,第三个选项。或'library(data.table); setDT(maint)[,ID:= sort(ID,decrease = TRUE),by = name]'或者类似于dplyr –