按列升序和降序排列数据框。

3

我正在尝试弄清如何按照下面数据框的c1列递减顺序和c2列递增顺序排序。

c1 <- c("a", "b", "c", "d", "d", "e", "f", "g", "h", "i")
c2 <- c("29-JAN-08", "29-JAN-08", "29-JAN-08", "29-JAN-08", "20-MAR-08", "28-MAR-08", "28-MAR-08", "28-MAR-08", "28-MAR-08", "28-MAR-08")
example <- data.frame(c1, c2)

我不能使用减号对日期向量进行计算:

> example <- example[order(example$c1, -example$c2),]
Error: unexpected input in "example <- example[order(example$c1, -1ex"

我一直没有弄清楚如何使用“decreasing”参数:

> example <- example[order(example$c1, example$c2, decreasing = c(F, T)),]
Error: unexpected input in "example <- example[order(example$c1, -1ex"

有没有办法按照这两列对数据框进行排序,第一列是字符类型,第二列是日期类型,第一列按升序排列,第二列按降序排列?

你需要在那个-1旁边加上一个*,首先要这样做 ;) - Ricardo Saporta
谢谢指出我的错别字。我已经修正了原始帖子。 - tjnel
问题比那个更根本,请看下面。 - IRTFM
2个回答

4

以下是使用 data.table 包的答案,它展示了更干净的代码带来的好处:

example <- as.data.table(example)
# set the date variable as an actual date first
example$c2 <- as.Date(example$c2,format="%d-%b-%Y")

# then sort - notice no need to keep referencing example$...
example[order(c1,-as.numeric(c2))]

一种基本的R版本是使用with函数来实现。
example[with(example,order(c1,-as.numeric(c2))),]

(+1) 除非原帖作者想继续使用data.table,否则我认为在这里使用with比转换为data.table更加简洁。 - Arun

3

这将进行反向词汇排序,但可能不是您的意图,因为您尚未转换为日期值,因此反向排序将首先在字符日期“字段”上执行:

 example[ order(example$c1, rev(example$c2)) , ]
#-------
   c1        c2
1   a 29-JAN-08
2   b 29-JAN-08
3   c 29-JAN-08
4   d 29-JAN-08
5   d 20-MAR-08
6   e 28-MAR-08
7   f 28-MAR-08
8   g 28-MAR-08
9   h 28-MAR-08
10  i 28-MAR-08

如果您想按照日期的真实倒序进行排序:

example[ order(example$c1, -as.numeric(as.Date(example$c2, format="%d-%b-%Y"))) , ]
#-----
   c1        c2
1   a 29-JAN-08
2   b 29-JAN-08
3   c 29-JAN-08
5   d 20-MAR-08
4   d 29-JAN-08
6   e 28-MAR-08
7   f 28-MAR-08
8   g 28-MAR-08
9   h 28-MAR-08
10  i 28-MAR-08
9   h 28-MAR-08
10  i 28-MAR-08

为什么在这里使用 orderrev?检查一下:c2[order(rev(c2))] 返回 "28-MAR-08" "29-JAN-08" "29-JAN-08" "29-JAN-08" "29-JAN-08" "20-MAR-08" "28-MAR-08" "28-MAR-08" "28-MAR-08" "28-MAR-08"... - Ferdinand.kraft
我有一个相关的问题。当我在我的全面问题上实施这个解决方案时,我收到了以下消息:警告信息: 在order(fullEx$C1, -as.numeric(fullEx$C2))中: 强制转换引入了NAs。在完整版本中,我在调用order之前将C2转换为日期类型,因此我没有省略该步骤。返回的数据框没有缺失值或NAs。 - tjnel
@Ferdinand.kraft:rev()函数可以将向量的顺序反转。我本来以为这不是正确的解决方案,但如果问题是如何使用字符向量,那么它就是正确的。 - IRTFM
@tjnel:我认为我建议转换为日期变量了吗???只是在带有破折号和字母的字符变量周围包装as.numeric....注定是一项失败的事业。 - IRTFM
@DWin 在调用 order 函数之前,我将其转换为日期类型。 - tjnel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接