2016-07-14 56 views
0

我有一個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 
+0

在你的情況,你可以,也許只是做'維護[順序(MAINT $名稱,-maint $ ID),]'或'data.table :: setorder (maint,name,-ID)'如果你需要效率。或者用'(maint,ave(ID,name,FUN = function(x)sort(x,decrease = TRUE)))' –

+0

我不確定第一個建議是否可行。因爲它將排序開始和結束日期字段,因爲我們按降序對ID進行排序 – user2543622

+0

在這種情況下,第三個選項。或'library(data.table); setDT(maint)[,ID:= sort(ID,decrease = TRUE),by = name]'或者類似於dplyr –

回答

0

您將要確保您的數據幀由名頭排序。你的例子是排序的,但你的數據可能不是。 dplyr解決方案可能更快。

因爲當ID是一個日期:

ID <- as.Date(c(25:50), '1999-1-1') 
ID <- sample(ID, length(ID)) 
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) 

maint$ID <- maint$ID[order(maint$name, -rank(maint$ID))] 

head(maint, 50) 

      ID name  start  end 
1 1999-02-20 a 2013-02-13 2013-02-20 
2 1999-02-17 a 2013-02-13 2013-02-20 
3 1999-02-15 a 2013-02-13 2013-02-20 
4 1999-02-12 a 2013-02-13 2013-02-20 
5 1999-02-11 a 2013-02-13 2013-02-20 
6 1999-02-10 a 2013-02-13 2013-02-20 
7 1999-02-06 a 2013-02-13 2013-02-20 
8 1999-02-05 a 2013-02-13 2013-02-20 
9 1999-02-03 a 2013-02-13 2013-02-20 
10 1999-02-01 a 2013-02-13 2013-02-20 
11 1999-01-31 a 2013-02-13 2013-02-20 
12 1999-01-26 a 2013-02-13 2013-02-20 
13 1999-02-19 b 2013-03-06 2013-03-13 
14 1999-02-18 b 2013-03-06 2013-03-13 
15 1999-02-16 b 2013-03-06 2013-03-13 
16 1999-02-14 b 2013-03-06 2013-03-13 
17 1999-02-13 b 2013-03-06 2013-03-13 
18 1999-02-09 b 2013-03-06 2013-03-13 
19 1999-02-08 b 2013-03-06 2013-03-13 
20 1999-02-07 b 2013-03-06 2013-03-13 
21 1999-02-04 b 2013-03-06 2013-03-13 
22 1999-02-02 b 2013-03-06 2013-03-13 
23 1999-01-30 b 2013-03-06 2013-03-13 
24 1999-01-29 b 2013-03-06 2013-03-13 
25 1999-01-28 b 2013-03-06 2013-03-13 
26 1999-01-27 b 2013-03-06 2013-03-13 
+0

這應該是組 –

+0

錯過了,這應該起作用。 – JMT2080AD

+0

在我的數據中,ID列實際上是一個日期字段,它被稱爲newstart,我得到一個錯誤。出了什麼問題? '-Date'中的錯誤(maint $ newstart): unary - 沒有爲「Date」對象定義# – user2543622