【问题标题】:How to reorder arbitrary integer vector to be in increasing order如何将任意整数向量重新排序为升序
【发布时间】:2014-05-26 13:01:18
【问题描述】:

这个问题是this question的后续问题。

假设我有一个很大的data.frame, df,列有u, v。我想对观察到的u, v 的变量交互进行编号按递增顺序,即从上到下遍历data.frame 时看到它们的顺序。

注意:假设df 有一些现有的订单,所以暂时不能重新排序。

本文底部显示的代码运行良好,只是返回的结果向量不是按升序排列的。也就是说,而不是当前的:

# result is in decreasing order here:
match(df$label, levels(df$label))
# [1] 5 6 3 7 4 7 2 2 1 1

# but we'd like it to be in increasing order like this:
# 1 2 3 4 5 4 6 6 7 7

我一直在尝试order(), rank(), factor(...ordered=T) 等,但似乎没有任何效果。我必须忽略一些明显的东西。有任何想法吗?

注意:也不允许通过将u, v 重新排序为单个因素来作弊。

set.seed(1234)
df <- data.frame(u=sample.int(3,10,replace=T), v=sample.int(4,10,replace=T))
#    u v
# 1  1 3
# 2  2 3
# 3  2 2
# 4  2 4
# 5  3 2
# 6  2 4
# 7  1 2
# 8  1 2
# 9  2 1
# 10 2 1

(df$label <- factor(interaction(df$u,df$v), ordered=T))
#  [1] 1.3 2.3 2.2 2.4 3.2 2.4 1.2 1.2 2.1 2.1
# Levels: 2.1 < 1.2 < 2.2 < 3.2 < 1.3 < 2.3 < 2.4

# This is ok except want increasing-order
match(df$label, levels(df$label))
# [1] 5 6 3 7 4 7 2 2 1 1

# no better.    
match(df$label, levels(df$label)[rank(levels(df$label))])
# [1] 6 7 1 4 3 4 5 5 2 2

【问题讨论】:

  • 已经存在:# ...but we want a result vector in increasing-order like this: 1 2 3 4 5 4 6 6 7 7
  • interaction 的输出因子级别的编号是任意的。不要将其称为“1 2 3 4 5 4 6 6 7 7”,而是将其视为 E、F、C、G、D、G、B、B、A、A。唯一重要的是首先看到 E (=> 1),其次看到 F (=> 2),依此类推。所以我们来自 df$label 的向量只需要(以某种方式)重新编号为 1 2 3 4 5 4 6 6 7 7 。我希望我很清楚:S
  • 不管怎样,墨菲定律说我很长时间都无法理解它,然后我刚把它作为一个问题发布,我就偶然发现了答案(如下)。

标签: r rank interaction


【解决方案1】:

呃!解决方法是添加interaction(... drop=T)。我仍然不完全明白为什么不这样做会破坏事情。

# The original factor from interaction() had unused levels...
str(df$label)
# Factor w/ 12 levels "1.1","1.2","1.3",..: 3 7 6 8 10 8 2 2 5 5

# SOLUTION
df$label <- interaction(df$u,df$v, drop=T)

str(df$label)
# Factor w/ 7 levels "2.1","1.2","2.2",..: 5 6 3 7 4 7 2 2 1 1

rank(unique(df$label))
# [1] 5 6 3 7 4 2 1

我们将使用该等级(如上所示)对观察到的级别进行重新排序,然后将我们的向量与它们进行如下匹配:

# And now we get the desired result
match(df$label, levels(df$label)[ rank(unique(df$label)) ] )
# [1] 1 2 3 4 5 4 6 6 7 7

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多