order()没有做好自己的工作

时间:2018-03-26 03:13:10

标签: r dataframe

这让我疯了。我正在尝试使用order函数按升序排序第一行的数据框。下面是一个最小的例子:

values <- c(11,10,9,8,7,6,5,4,3,2,1)

labels <- c("A","B","C","D","E","F","G","H","I","J","K")

df <- data.frame(rbind(values,labels))

newdf <- df[,with(df,order(df[1,]))]

print(newdf)

我也用

尝试了这个
newdf <- df[,order(df[1,])]

这是我得到的输出

        X11 X2 X1 X10 X9 X8 X7 X6 X5 X4 X3
values   1 10 11   2  3  4  5  6  7  8  9
labels   K  B  A   J  I  H  G  F  E  D  C

这显然是错误的!那么这里发生了什么?

1 个答案:

答案 0 :(得分:3)

这是在R中构建数据的奇怪方法,因此会引起麻烦,但您可以使其工作。请参阅@thelatemail的评论:列与行。要在您的情况下使这项工作,请执行:

values <- c(11,10,9,8,7,6,5,4,3,2,1)
labels <- c("A","B","C","D","E","F","G","H","I","J","K")
df <- data.frame(rbind(values,labels), stringsAsFactors = FALSE)
newdf <- df[order(as.numeric(df["values",]))]
newdf
#        X11 X10 X9 X8 X7 X6 X5 X4 X3 X2 X1
# values   1   2  3  4  5  6  7  8  9 10 11
# labels   K   J  I  H  G  F  E  D  C  B  A

特别注意,在创建数据框时stringsAsFactors = FALSE

请记住,data.frames是列表,列表的每个元素都是一个相同长度的向量(可能是一个列表,但通常是一个原子向量,特别是如果以标准方式构造)。数据框的各个元素是列。行只是具有相同索引值的嵌套元素。这样可以更轻松地使用这样的数据框:

df <- data.frame(values = values, labels = labels)
df[order(df$values),]
#    values labels
# 11      1      K
# 10      2      J
# 9       3      I
# 8       4      H
# 7       5      G
# 6       6      F
# 5       7      E
# 4       8      D
# 3       9      C
# 2      10      B
# 1      11      A

在这里,您不必担心当您使用另一个角色向量对齐时,您的数字是否会被强制转换为角色和/或因素。在此示例中,labels是否是一个因素对values没有影响。