【发布时间】:2016-07-14 21:17:04
【问题描述】:
我有一个如下的data.frame。对于name 列中的每组不同值,我想颠倒ID 列的顺序。我不想触摸其余的列。我的数据很大。我应该如何有效地做到这一点?
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[order(maint$name, -maint$ID),]或data.table::setorder(maint, name, -ID)。或with(maint, ave(ID, name, FUN = function(x) sort(x, decreasing = TRUE))) -
我不确定第一个建议是否可行。因为它会对开始和结束日期字段进行排序,因为我们按降序对 ID 进行排序
-
在这种情况下是第三个选项。或
library(data.table) ; setDT(maint)[, ID := sort(ID, decreasing = TRUE), by = name]或类似的 dplyr
标签: r sorting multiple-columns