维护R中的子数据集中的顺序

时间:2014-05-04 20:53:12

标签: r subset

我有一个数据框df

V1  V2  V3
1   227 Day1
2   288 Day2
3   243 Day3
4   258 Day4
5   274 Day5
6   245 Day6
7   254 Day7
8   249 Day8
9   230 Day9
10  244 Day10

我希望按顺序对df V1包含5,1,7,3进行分组。我使用subset(df,V1 %in% c(5,1,7,3)),但我得到的是:

V1  V2  V3
1   227 Day1
3   243 Day3
5   274 Day5
7   254 Day7

我希望将V1中的行顺序维持为5,1,7,3而不是1,3,5,7。我怎样才能得到输出:

V1  V2  V3
5   274 Day5
1   227 Day1
7   254 Day7
3   243 Day3

2 个答案:

答案 0 :(得分:2)

这可能过于复杂,但我会按如下方式处理此任务:

示例性数据框:

(data2 <- data.frame(V1=1:10, V2=letters[1:10]))
##    V1 V2
## 1   1  a
## 2   2  b
## 3   3  c
## 4   4  d
## 5   5  e
## 6   6  f
## 7   7  g
## 8   8  h
## 9   9  i
## 10 10  j

让我们找到匹配的行(NA - 不匹配,i - i - 匹配的值):

(m <- match(data2$V1, c(5,1,7,3)))
##  [1]  2 NA  4 NA  1 NA  3 NA NA NA

现在我们选择匹配的行匹配并相应地置换它们:

data2[!is.na(m),][order(na.omit(m)),]
##   V1 V2
## 5  5  e
## 1  1  a
## 7  7  g
## 3  3  c

另一方面,如果您知道V1由连续的自然数组成(从1开始),那么解决方案就像1-2-3一样简单:

data2[c(5,1,7,3),]
##   V1 V2
## 5  5  e
## 1  1  a
## 7  7  g
## 3  3  c

答案 1 :(得分:1)

您可以将mergesort=FALSE一起使用,它似乎按照匹配的顺序返回。如果您在V1中重复了值,它也会起作用。 E.g:

dat <- data.frame(V1=1:10, V2=letters[1:10])
dat$V1[8] <- 5

dat
#   V1 V2
#1   1  a
#2   2  b
#3   3  c
#4   4  d
#5   5  e
#6   6  f
#7   7  g
#8   5  h
#9   9  i
#10 10  j

merge(data.frame(V1=c(5,1,7,3)),dat,by="V1",sort=FALSE)

#  V1 V2
#1  5  e
#2  5  h
#3  1  a
#4  7  g
#5  3  c