将排名列添加到数据框

时间:2015-08-03 17:48:58

标签: r dataframe

我有一些月度数据,我想在我的数据框中添加一列,将第一列中的最小值与第一列中的最大值相关联。第一列中的第二个最小值到第一列中的第二个最大值,等等......

以下是一些示例数据

x1<-c(100,151,109,59,161,104,170,101)
dat<-data.frame(x1)
rownames(dat)<-c('Apr','May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov')

     x1
Apr 100
May 151
Jun 109
Jul  59
Aug 161
Sep 104
Oct 170
Nov 101

我试图让我的数据看起来像这样

     x1   x2
Apr 100  161
May 151  101
Jun 109  104
Jul  59  170
Aug 161  100
Sep 104  109
Oct 170   59
Nov 101  151

我正在排名,排序和排序。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:6)

如果您创建一个具有升序和降序值的临时对象,那么它是相当简单的:

> temp <- data.frame(asc =x1[order(x1)],desc=x1[rev(order(x1))])
> dat$x2 <- temp$desc[ match(dat$x1, temp$asc) ]
> dat
     x1  x2
Apr 100 161
May 151 101
Jun 109 104
Jul  59 170
Aug 161 100
Sep 104 109
Oct 170  59
Nov 101 151

match函数用于构造整数索引值,用作&#34; [&#34;的参数。它是merge内的基本功能。

答案 1 :(得分:4)

利用基础R month.abb

df = dat[order(dat$x1),, drop = FALSE]
df$x2 = sort(x1,decreasing = T)
df[match(month.abb, rownames(df), nomatch = 0),]

#     x1  x2
#Apr 100 161
#May 151 101
#Jun 109 104
#Jul  59 170
#Aug 161 100
#Sep 104 109
#Oct 170  59
#Nov 101 151

简单地使用data.table

library(data.table)
df = setDF(setDT(dat, keep.rownames=T)[order(x1), x2 := sort(x1, decreasing = T)])
rownames(df) = df$rn; df[,1] = NULL

#     x1  x2
#Apr 100 161
#May 151 101
#Jun 109 104
#Jul  59 170
#Aug 161 100
#Sep 104 109
#Oct 170  59
#Nov 101 151

答案 2 :(得分:4)

与@BondedDust类似的想法:

library(dplyr)
dat %>% mutate(x2 = x1[match(row_number(desc(x1)), row_number(x1))])

给出了:

#   x1  x2
#1 100 161
#2 151 101
#3 109 104
#4  59 170
#5 161 100
#6 104 109
#7 170  59
#8 101 151

答案 3 :(得分:3)

data.table中的方法:

library(data.table)
setDT(dat,keep.rownames=T)[order(x1),x2:=rev(x1)]
    rn  x1  x2
1: Jul  59 170
2: Apr 100 161
3: Nov 101 151
4: Sep 104 109
5: Jun 109 104
6: May 151 101
7: Aug 161 100
8: Oct 170  59

如果您希望按顺序结束行,我认为最简单的方法是使用month.abb作为rn的级别作为因素:

setDT(dat,keep.rownames=T)[order(x1),x2:=rev(x1)
                           ][order(factor(rn,levels=month.abb))]
    rn  x1  x2
1: Apr 100 161
2: May 151 101
3: Jun 109 104
4: Jul  59 170
5: Aug 161 100
6: Sep 104 109
7: Oct 170  59
8: Nov 101 151

如果适合您,也可以使用order(match(rn,month.abb))代替;如果您要按月重新排序,那么将rn定义为一个因素可能是有意义的,因此您不必执行match或{{ 1}}狗和小马反复出现:factor