重新排序R data.frame的子集以及修改行名

时间:2017-04-06 10:13:21

标签: r dataframe

给出data.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 个答案:

答案 0 :(得分:6)

我们可以使用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

答案 1 :(得分:2)

不像ronak-shah的回答那么简洁,但您也可以使用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")

现在,rownames是

# 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

答案 2 :(得分:0)

您的数据框很小,因此您可以复制它,然后更改每个原始数据的值:

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

鲍勃