2015-08-03 26 views
8

Bazı aylık verilerim var ve veri çerçeveme ilk sütundaki en küçük değeri ilk sütundaki en büyük değere bağlayan bir sütun eklemek istiyorum. vb birinci sütunda ikinci büyük değere ilk sütunda, ikinci en küçük değeri ... İşteVeri çerçevesine sıralı sütun ekleme

bazı örnek veriler

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 

benim verileri bu

gibi görünmeye almaya çalışıyorum olduğunu
 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 

Sıralı, sıralı ve sıralı daireler çiziyorum. Herhangi bir yardım takdir edilecektir.

cevap

6

Eğer artan sahip geçici bir nesne oluşturmak ve değerler eşleştirilmiş azalan eğer makul basittir:

> 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 

The match işlevi, "[" için argümanlar olarak kullanılan tamsayı indeksleme değerleri oluşturmak için tasarlanmıştır. Bu, merge'un içindeki temel işlevdir. @BondedDust olarak

4

data.table kullanma baz R en 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 

yararlanarak basitçe

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 
4

Benzer fikir:

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

verir:

# 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

Yaklaşım data.table yılında:

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 

sırayla satırlarla bitirmek istiyorsanız, Bence en kolay yolu month.abb'u rn ve Bir faktör s:

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 

o size uygun olup olmadığından da yerine order(match(rn,month.abb)) kullanmak Could; dat[,rn:=factor(rn,levels=month.abb)][order(rn)]

+2

orijinal düzeni: aya göre çok yeniden sıralama olacağız eğer art arda match veya factor köpek ve midilli gösterisi yapmak zorunda kalmamak için, bu bir faktör olarak rn tanımlamak için mantıklı olabilir sonunda kurtarılmalı, hayır? – Frank

+0

Mutlaka değil, ancak bunu yapmak için bir düzenleme ekliyorum. – MichaelChirico

+0

@VeerendraGadekar bonus ekledi: kodumu kullanmak için 'data.table'ın geliştirme sürümüne artık gerek yok (inanıyorum ...) – MichaelChirico

İlgili konular