在R中订购多个列

时间:2014-05-20 07:54:24

标签: r

示例数据:

now <- data.frame(id=c(123,123,123,222,222,222,135,135,135),year=c(2002,2001,2003,2006,2007,2005,2001,2002,2003),freq=c(3,1,2,2,3,1,3,1,2))

期望的输出:

wanted <- data.frame(id=c(123,123,123,222,222,222,135,135,135),year=c(2001,2002,2003,2005,2006,2007,2001,2002,2003),freq=c(1,2,3,1,2,3,1,2,3))

此解决方案有效,但我收到内存错误(cannot assign 134kb...)

ddply(now,.(id), transform, year=sort(year))

请注意我需要速度有效的解决方案,因为我有长度为300K和50列的数据帧。谢谢。

2 个答案:

答案 0 :(得分:4)

您可以使用dplyr对其进行排序(在dplyr中称为排列)。 dplyr也比plyr快。

wanted <- now %>% arrange(id, year) 
# or: wanted <- arrange(now, id, year)

> wanted
#   id year freq
#1 123 2001    1
#2 123 2002    3
#3 123 2003    2
#4 135 2001    3
#5 135 2002    1
#6 135 2003    2
#7 222 2005    1
#8 222 2006    2
#9 222 2007    3

你可以用基数R做同样的事情:

wanted <- now[order(now$id, now$year),]

然而,您的nowwanted data.frame对于id == 123和2002年存在差异(在您现在的df中,频率为2而在想要的情况下为3) DF)。根据您的问题,我认为这是一个错字,您实际上并不想更改freq值。

答案 1 :(得分:3)

你可以在这里使用基本R功能

now <- now[order(now$id, now$year), ]

data.table以提高性能

library(data.table)
setDT(now)[order(id, year)]

now <- data.table(now, key = c("id", "year"))

setDT(now)
setkey(now, id, year)