我们只需要order
数据集按升序排列,可以通过以下方式完成order
df1 <- df[c('rows', 'columns', 'Observed', 'Modeled')]
df2 <- df1[do.call(order, -df1),]
在OP的代码中,更改sapply
to lapply
返回为list
(sapply
默认情况下使用simplify = TRUE
返回一个matrix
)
do.call(rbind, lapply(list(unique(df$rows),
unique(df$columns)),
FUN = function(x) {
data.frame(rows = x[[1]],
columns = x[[2]],
Observed = sort(df$Observed[df$rows == x[[1]] &
df$columns == x[[2]]]),
Modeled = sort(df$Modeled[df$rows == x[[1]] &
df$columns == x[[2]]])
)
}
))
# rows columns Observed Modeled
#1 6 4 17.8 2.620
#2 6 4 19.2 2.875
#3 6 4 21.0 3.440
#4 6 4 21.0 3.440
#5 4 3 21.5 2.465
通过循环unique
as a list
,每个向量都是一个单独的list
元素和x[[1]]
, x[[2]]
实际上是基于第二个元素的 6, 4 和 4, 3 进行子集化
list(unique(df$rows), unique(df$columns))
#[[1]]
#[1] 6 4 8
#[[2]]
#[1] 4 3 5
相反,如果我们需要对相应的元素执行此操作,则使用Map
或循环序列unique
元素(假设它们具有相同的长度),但更简单的方法是split
如果长度相同unique
元素,并且想要根据相应的值进行子集,然后使用Map
do.call(rbind, Map(function(x, y) {
i1 <- df$rows == x & df$columns == y
data.frame(rows = x, columns = y,
Observed = sort(df$Observed[i1]),
Modeled = sort(df$Modeled[i1]))},
unique(df$rows), unique(df$columns)))
# rows columns Observed Modeled
#1 6 4 17.8 2.620
#2 6 4 19.2 2.875
#3 6 4 21.0 3.440
#4 6 4 21.0 3.440
#5 4 3 21.5 2.465
#6 8 5 15.0 3.170
#7 8 5 15.8 3.570