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