我在r
中有以下数据框 ID bay row number
1 43 11 ABC
2 43 6 DEF
3 43 13 QWE
4 43 15 XDF
5 43 4 VGH
6 43 2 TYU
7 11 11 QAS
8 11 13 QTO
9 11 12 EWQ
10 11 10 RFT
我希望按bay
我想要的数据框将会跟随
ID bay row number
1 43 15 XDF
2 43 13 QWE
3 43 11 ABC
4 43 2 TYU
5 43 4 VGH
6 43 6 DEF
7 11 13 QTO
8 11 11 QAS
9 11 10 RFT
10 11 12 EWQ
我怎么能在dplyr中这样做?
答案 0 :(得分:2)
对于base
解决方案,请按row
是奇数还是偶数来拆分数据,然后使用mapply
对它们进行单独排序。
df <-
structure(list(ID = 1:10,
bay = c(43L, 43L, 43L, 43L, 43L, 43L,
11L, 11L, 11L, 11L),
row = c(11L, 6L, 13L, 15L, 4L, 2L, 11L,
13L, 12L, 10L),
number = c("ABC", "DEF", "QWE",
"XDF", "VGH", "TYU",
"QAS", "QTO", "EWQ",
"RFT")),
.Names = c("ID", "bay", "row", "number"),
class = "data.frame",
row.names = c(NA, -10L))
df <- split(df, df$row %%2 == 0)
df <-
mapply(function(DF, decr) DF[order(DF$row, decreasing = decr), ],
df,
decr = c(TRUE, FALSE),
SIMPLIFY = FALSE)
df <- do.call("rbind", df)
答案 1 :(得分:2)
使用ave
和order
的基础R中的另一个选项是
dat[ave(seq_along(dat$row), dat$bay,
FUN=function(x) x[order(dat$row[x] * (-1)^dat$row[x])]),]
此方法的灵感来自this answer,但使用ave
对使用seq_along(dat$row)
构建的data.frame的行位置进行分组和添加顺序。 order
,dat $ row [x]中的元素是根据此向量的子集,以便控制分组。
返回
ID bay row number
4 4 43 15 XDF
3 3 43 13 QWE
1 1 43 11 ABC
6 6 43 2 TYU
5 5 43 4 VGH
2 2 43 6 DEF
8 8 11 13 QTO
7 7 11 11 QAS
10 10 11 10 RFT
9 9 11 12 EWQ
答案 2 :(得分:0)
data.table
library(data.table)
setDT(dat)[order(row *(-1)^row), .SD, .(bay)]