R 根据格式化为%d/%m/%Y的日期按时间顺序排列数据帧

R 根据格式化为%d/%m/%Y的日期按时间顺序排列数据帧,r,date-formatting,R,Date Formatting,我有一些数据必须格式化为(%d/%m/%Y)。数据的时间顺序不正确,因为它是按第一个数字排序的,第一个数字是日期,而不是月份 我希望我可以指定排序或重新排序,我希望排序以不同的方式进行。我只是不知道该怎么做 以下是一些需要订购的日期数据: date 1/1/2009 1/1/2010 1/1/2011 5/4/2009 5/4/2011 10/2/2009 10/3/2011 15/9/2010 15/3/2009 31/12/2011 31/7/2009 谢谢您的建议。按列订购时日期转换

我有一些数据必须格式化为(%d/%m/%Y)。数据的时间顺序不正确,因为它是按第一个数字排序的,第一个数字是日期,而不是月份

我希望我可以指定
排序
重新排序
,我希望排序以不同的方式进行。我只是不知道该怎么做

以下是一些需要订购的日期数据:

date
1/1/2009  
1/1/2010
1/1/2011
5/4/2009
5/4/2011
10/2/2009
10/3/2011
15/9/2010
15/3/2009
31/12/2011
31/7/2009

谢谢您的建议。

按列订购时
日期
转换日期格式

df[order(as.Date(df$date,format="%d/%m/%Y")),,drop=FALSE]
         date
1    1/1/2009
6   10/2/2009
9   15/3/2009
4    5/4/2009
11  31/7/2009
2    1/1/2010
8   15/9/2010
3    1/1/2011
7   10/3/2011
5    5/4/2011
10 31/12/2011

丑陋但似乎有效:

date[order(sapply(strsplit(date, "/"), 
                  function(x) { paste(x[3], sprintf("%02d", as.integer(x[1])), 
                                            sprintf("%02d", as.integer(x[2])), 
                                            sep="") 
                              }
                 )
          )
    ]

在plyr和lubridate的帮助下,这更容易:

library(lubridate)
library(plyr)

df <- read.csv(text = "date
1/1/2009  
1/1/2010
1/1/2011
5/4/2009
5/4/2011
10/2/2009
10/3/2011
15/9/2010
15/3/2009
31/12/2011
31/7/2009", stringsAsFactors = FALSE)

# Convert variable to date    
df$date <- dmy(df$date)
arrange(df, date)
# Or for descending order
arrange(df, desc(date))
库(lubridate)
图书馆(plyr)

df您是否介意在代码中添加一些注释和缩进,以便我们能够更好地阅读它(并避免水平滚动)?谢谢!这让我想知道有多少次我不得不告诉R某件事是一个日期,但我猜答案是“每次”。我不同意你在这里说的更容易,因为公认的解决方案不需要附加软件包,并且在一个声明中解决了这个问题。如果你愿意,欢迎你玩代码高尔夫。我认为我的解决方案是一个很好的选择,因为你不需要知道日期格式字符串是如何工作的,也不需要知道为什么你需要
drop=FALSE
你可以通过替换/重新定义R的每一个方面,将R重新定义为“H”。唐·吉诃德,西班牙还有很多风车供你大喊:)谢谢,@hadley。我一直在努力使用R中的日期,所以我一定会研究lubridate。我会说@hadley为胜利。至少对我来说,作为日期导入并使用语法非常接近NL的函数比在函数中强制转换为日期更容易。当然,公认的答案并不坏,但对于新手来说,很难解析。软件包的全部功能不是改造了R,使编码更加精简吗?您是否还希望将该日期字符串保留为其原始格式,例如用于在绘图上标记记号?i、 e.保存为单独的列