订购非数值的data.frame

时间:2011-12-12 15:08:00

标签: r sorting

我有一个看起来像这样的data.frame:

320    Dutch  A7     3

321    Dutch  A8     3

322    Dutch  A9     4

323    Dutch A10     1

324    Dutch A11     4

327    Dutch A14     4

325    Dutch A12     3

328    Dutch A15    10

326    Dutch A13     1

329    Dutch A16     3

我如何订购,以便所有A1, A2, etc.按字母顺序和数字顺序排列,以便我得到:

320    Dutch  A7     3

321    Dutch  A8     3

322    Dutch  A9     4

323    Dutch A10     1

324    Dutch A11     4

325    Dutch A12     3

326    Dutch A13     1

327    Dutch A14     4

328    Dutch A15    10

329    Dutch A16     3

谢谢!

2 个答案:

答案 0 :(得分:1)

你回答了自己的问题。请参阅order函数的帮助。另请参阅this rant

答案 1 :(得分:1)

暂时忘记数据框部分。这是您要订购的示例矢量

x <- paste(
  rep.int(LETTERS[1:3], 16),
  rep.int(1:16, 3),
  sep = ""
)
y <- sample(x)

只是调用sort(y)将无效,因为数字按字面顺序排序,所以你会得到类似A1,A10,A11,......

而是使用substring将列拆分为字母和数字。

indexer <- data.frame(
  letter = substring(y, 1, 1),
  number = as.numeric(substring(y, 2))
)

然后,正如aL3xa建议的那样,请致电order订购结果数据框。

o <- with(indexer, order(letter, number))
y[o]

要使其与数据框一起使用,只需将y替换为your_data$index_column