根据另一个变量重新排列变量

时间:2017-03-29 17:53:32

标签: r

数据:

set.seed(25)
df<- data.frame(rank=round(rnorm(10)),category=round(runif(10)),v=round(rnorm(10)))

   rank category  v
1     0        0  1
2    -1        0 -1
3    -1        0  1
4     0        0  2
5    -2        0 -1
6     0        0  1
7     2        0  0
8     1        1  0
9     0        1  2
10    0        0 -2

我想要变量&#34; v&#34;在每个类别中遵循与变量&#34; rank1&#34;相同的排名。我的问题是如何创建所需的变量&#34; v1&#34;?

期望的输出:

df <- transform(df, rank1 = ave(v, category, FUN = function(x) rank(x, ties.method = "random")))

   rank category  v rank1  v1
1     0        0  1     6 -1
2    -1        0 -1     3  1
3    -1        0  1     7 -1
4     0        0  2     8 -2
5    -2        0 -1     2  1
6     0        0  1     5  0
7     2        0  0     4  1
8     1        1  0     1  2
9     0        1  2     2  0
10    0        0 -2     1  2

1 个答案:

答案 0 :(得分:1)

所以我得到了理想的结果:

set.seed(25)
df <- data.frame(rank=round(rnorm(10)), category=round(runif(10)), v=round(rnorm(10)))
df <- transform(df, rank1 = ave(v, category, FUN = function(x) rank(x, ties.method = "random")))

df$v1 <- NA

for (i in unique(df$category)) {
  df$v1[df$category==i] <- sort(df$v[df$category==i], decrea=TRUE)[df$rank1[df$category==i]]
}

这个想法是通过类别并将rank1给出的顺序应用到向量v排序部分。