这个问题是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
答案 0 :(得分:0)
咄!解决方案是添加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