基于非数字小排序重新排序表
我想重新排列基于行名的自定义顺序的表中的行,但我的行名称是字符而不是数字。基于非数字小排序重新排序表
我使用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(使用barplot(data, ...)
),我不知道如何摆脱额外的柱。
任何想法?
如果您查看帮助文件,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,但作为@加文 - 辛普森在他的帖子讨论,这将是最好进行排序之前计算表格。
这可能不是最佳解决方案,但如果行顺序基于列名之一,则可以始终使用dplyr。
例如,如果你想让他们由“MYV”顺序进行排序,你可以使用 -
library('dplyr')
dataa <- arrange(data, Myv)
的顺序从行的名称确实是字母,它来自于一个事实,即您的变量Type
是一个因素(或被强制进入)。在使用table
之前,您可以重新排列您的因素水平。
下面是使用warpbreaks
数据集附带有R的例子:
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
辉煌,谢谢!这工作完美。 –
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
在你的具体的例子,我会做
allcones <- transform(allcones,
Type = factor(Type, levels = c("L","D","S","T","H","P", "U"))
with(allcones, table(Type, Location))
注意'data'在OP的例子是类“table”的对象(它实际上是一个包含一些额外内容的矩阵),而不是数据框。 –
@GavinSimpson谢谢。我错过了。 – lmo