R 向数据框添加排序列

R 向数据框添加排序列,r,dataframe,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 1

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

下面是一些示例数据

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

我将以等级、排序和顺序进行循环。任何帮助都将不胜感激。

利用base R的
月。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
简单地使用
数据表

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

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

> 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
>温度数据$x2数据
x1-x2
161年4月100日
101年5月15日
6月109日104
7月59日170
100年8月16日
九月104日109
10月17日59
11月101日151

match
函数用于构造用作“[”参数的整数索引值。它是
merge

中的基本函数,与@bondedust的思想类似:

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

数据表中的方法

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
factor
狗和小马表演:
dat[,rn:=factor(rn,levels=month.abb)][order(rn)]

最终应该恢复原始订单,不是吗?不一定,但如果是这样的话,我会添加一个编辑。@VeerendraGadekar增加了额外的好处:不再需要
数据的开发版本。table
来使用我的代码(我相信…@VeerendraGadekar是的。
月。abb
知道这一点很好,+1。
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