如何在dplyr中按降序排列奇数,按升序排列偶数
我在r中有以下数据帧如何在dplyr中按降序排列奇数,按升序排列偶数,r,R,我在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
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
我想将奇数按降序排列,偶数按升序按间隔分组
我想要的数据帧如下
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中执行此操作 库(dplyr)
library(dplyr)
df <- read.table(text =
" 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 ",
stringsAsFactors = FALSE, header = TRUE)
arrange(df, desc(bay), desc(row %% 2), row * (-1)^(row%%2))
# ID bay row number
# 1 4 43 15 XDF
# 2 3 43 13 QWE
# 3 1 43 11 ABC
# 4 6 43 2 TYU
# 5 5 43 4 VGH
# 6 2 43 6 DEF
# 7 8 11 13 QTO
# 8 7 11 11 QAS
# 9 10 11 10 RFT
# 10 9 11 12 EWQ
df对于base
解决方案,按行
是奇数还是偶数拆分数据,并使用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)
df在base R中使用ave
和order
的另一个选项是
dat[ave(seq_along(dat$row), dat$bay,
FUN=function(x) x[order(dat$row[x] * (-1)^dat$row[x])]),]
此方法受ave
的启发,但使用ave
对data.frame的行位置进行分组和添加顺序,并使用seq_-along(dat$row)
构建。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
另一个带有data.table的选项
library(data.table)
setDT(dat)[order(row *(-1)^row), .SD, .(bay)]
是否有理由不在所需输出中重新排列ID
?你也要重新编号ID
s吗?@Aurele很抱歉,我忘了更改输出。使用基数R:与(df,df[order(-bay,-(row%%2),row*(-1)^(row%%2)),])或df[order(-df$bay,-(df$row%%2),df$row*(-1)^(df$row%%2)),]进行差异。