我有一个数据框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
答案 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)
您可以将merge
与sort=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