根据非数字rownames重新排序表格

时间:2017-03-17 15:32:28

标签: r

我正在尝试将基于行名称的表中的行重新排序为自定义顺序,但我的行名称是字符而不是数字。

我使用table工具从更大的数据框中创建了一个R数据表:

data <- table(allcones$Type, allcones$Location)[,]

这给了我一个如下表:

> Ada Alf Lk Lnd Myv Raud D 3 0 10 0 59 0 H 3777 0 0 0 8 0 L 11 0 34 4 34 5 P 0 0 0 0 187 0 S 585 0 1880 0 460 109 T 100 0 0 0 233 0 U 234 517 401 4057 9 0

行名称(D,H,L ...)目前按字母顺序排序,我认为这是R中的默认值。但是,它们各自反映了不同的数据类,因此我想将它们放入自定义顺序

我尝试过使用 reorder(row.names(data), new.order=c('L', 'D', 'S', 'T', 'H', 'P', 'U'))基于此网站上的其他问题,但这不起作用。似乎row.names(data)不是reorder函数中的有效参数。

我不想创建一个新列来强制订单,因为我正在使用这些数据来制作表格的堆积条形图(使用barplot(data, ...)),我不知道如何摆脱额外的列。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

这可能不是最佳解决方案,但如果行顺序基于其中一个列名,则可以始终使用dplyr。

例如,如果您希望按照“Myv&#39;订单,您可以使用 -

library('dplyr')
dataa <- arrange(data, Myv)

答案 1 :(得分:1)

@using (Html.BeginForm()) {<div class="jumbotron"> <div class="row"> <div class="col-md-12"> <p> Search: @Html.TextBox("SearchString") <input class="btn btn-info" type="submit" value="Search" /> </p> </div> </div> </div> } 尊重作为参数传递的因子级别的顺序或者强制转换为因子的参数(在这种情况下,将生成级别的默认顺序)。

所以,而不是

table()

给出了

df <- data.frame(f1 = sample(LETTERS[1:5], 1000, replace = TRUE),
                 f2 = sample(letters[23:26], 1000, replace = TRUE))
with(df, table(f1, f2))

将因子参数的> with(df, table(f1, f2)) f2 f1 w x y z A 48 41 44 63 B 35 50 35 49 C 52 79 48 52 D 49 51 50 55 E 46 45 60 48 显式设置为您想要的顺序。例如,我在这里只是颠倒了顺序,但您可以明确指定它:

levels

给出了

df2 <- transform(df, f1 = factor(f1, levels = LETTERS[5:1]),
                     f2 = factor(f2, levels = letters[26:23]))
with(df2, table(f1, f2))

在你的具体例子中我会做

> with(df2, table(f1, f2))
   f2
f1   z  y  x  w
  E 48 60 45 46
  D 55 50 51 49
  C 52 48 79 52
  B 49 35 50 35
  A 63 44 41 48

答案 2 :(得分:0)

如果查看帮助文件,reorder用于重新排序因子级别。有点令人困惑的是,order用于(除其他事项外)订购data.frames行。

可以使用factor功能和order来达到您想要的效果。

dfMyOrder <- df[order(factor(row.names(df), levels=c('L', 'D', 'S', 'T', 'H', 'P', 'U'))),]

返回

dfMyOrder

   Ada Alf   Lk  Lnd Myv Raud
L   11   0   34    4  34    5
D    3   0   10    0  59    0
S  585   0 1880    0 460  109
T  100   0    0    0 233    0
H 3777   0    0    0   8    0
P    0   0    0    0 187    0
U  234 517  401 4057   9    0

这适用于表对象和data.frames,但正如@ gavin-simpson在他的帖子中讨论的那样,最好在计算表之前执行排序。

答案 3 :(得分:0)

您的行名称的排序确实是按字母顺序排列的,它来自您的变量Type是一个因素(或正在被强制转换为它)的事实。在使用table之前,您可以重新排序因子级别。

以下是使用R附带的warpbreaks数据集的示例:

w <- warpbreaks
table(w$tension, w$wool)
# The default order here is L, M, H (not alphabetical) 
#    A B
#  L 9 9
#  M 9 9
#  H 9 9
## let's redefine the order:
w$tension <- factor(w$tension, levels = c("H", "M", "L"))
table(w$tension, w$wool)
#    A B
#  H 9 9
#  M 9 9
#  L 9 9