Порядок подмножество данных R.frame также изменяет имена строк

учитывая данные.кадр:

foo <- data.frame(ID=1:10, x=1:10)
rownames(foo) <- LETTERS[1:10]

Я хотел бы изменить порядок подмножества строк, определенных их именами строк. Тем не менее, я хотел бы поменять местами имена строк foo. Я могу сделать

sel <- c("D", "H") # rows to reorder
foo[sel,] <- foo[rev(sel),]
sel.wh <- match(sel, rownames(foo))
rownames(foo)[sel.wh] <- rownames(foo)[rev(sel.wh)]

но это долго и сложно. Есть ли более простой способ?

3 ответов


мы можем заменить sel значения rownames С реверс sel.

x <- rownames(foo)
foo[replace(x, x %in% sel, rev(sel)), ]

#  ID  x
#A  1  1
#B  2  2
#C  3  3
#H  8  8
#E  5  5
#F  6  6
#G  7  7
#D  4  4
#I  9  9
#J 10 10

Не так лаконично, как ответ Ронак-шаха, но вы также можете использовать order.

# extract row names
temp <- row.names(foo)
# reset of vector
temp[which(temp %in% sel)] <- temp[rev(which(temp %in% sel))]
# reset order of data.frame
foo[order(temp),]
  ID  x
A  1  1
B  2  2
C  3  3
H  8  8
E  5  5
F  6  6
G  7  7
D  4  4
I  9  9
J 10 10

как отмечено в комментариях, это зависит от имен строк, следующих за лексикографическим порядком. В случаях, когда это не так, мы можем использовать match.

# set up
set.seed(1234)
foo <- data.frame(ID=1:10, x=1:10)
row.names(foo) <- sample(LETTERS[1:10])
sel <- c("D", "H")

теперь, имена строк

# initial data.frame
foo
  ID  x
B  1  1
F  2  2
E  3  3
H  4  4
I  5  5
D  6  6
A  7  7
G  8  8
J  9  9
C 10 10

# grab row names
temp <- row.names(foo)

# reorder vector containing row names
temp[which(temp %in% sel)] <- temp[rev(which(temp %in% sel))]

используя match вместе с тем

foo[order(match(row.names(foo), temp)),]
  ID  x
B  1  1
F  2  2
E  3  3
D  6  6
I  5  5
H  4  4
A  7  7
G  8  8
J  9  9
C 10 10

ваш фрейм данных мал, поэтому вы можете дублировать его, а затем изменить значение каждого raw:

footmp<-data.frame(foo)
foo[4,]<-footemp[8,]
foot{8,]<-footemp[4,]

Боб