我有一些月度数据,我想在我的数据框中添加一列,将第一列中的最小值与第一列中的最大值相关联。第一列中的第二个最小值到第一列中的第二个最大值,等等......
以下是一些示例数据
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
我正在排名,排序和排序。任何帮助将不胜感激。
答案 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