R函数对列表对象中的数据帧进行排序
我试图找到一个优雅的函数来对列表对象中的data.frames进行排序。我已经知道lappy(df,function(x)x[with(x,order(var)),])工作得很好,但这似乎太复杂了。我正在尝试使用“[”函数,如果我手动输入行号,它可以正常工作。但显然,我希望使用order函数生成的行号R函数对列表对象中的数据帧进行排序,r,list,dataframe,sorting,R,List,Dataframe,Sorting,我试图找到一个优雅的函数来对列表对象中的data.frames进行排序。我已经知道lappy(df,function(x)x[with(x,order(var)),])工作得很好,但这似乎太复杂了。我正在尝试使用“[”函数,如果我手动输入行号,它可以正常工作。但显然,我希望使用order函数生成的行号 df <- list( data.frame(name = c("John", "Paul", "George", "Ringo"), height = c(60, 58, 65
df <- list(
data.frame(name = c("John", "Paul", "George", "Ringo"), height = c(60, 58, 65, 55)),
data.frame(name = c("Frank", "Tony", "Arthur", "Edward"), height = c(55, 65, 60, 50))
)
lapply(df, "[", c("height", "name"))
lapply(df, "[", c(3:1), )
order <- lapply(df, with, order(name))
order
lapply(df, with, order(name), "[")
lapply(df, with, "[", order(name), )
lapply(df, "[", with, order(name), )
Map("[", order , , df)
df我们可以使用arrange
和map
library(dplyr)
library(purrr)
map(df, ~ .x %>%
arrange(name))
如果您使用library(data.table)
而不是data.frame
,那么解决方案非常优雅
我们可以使用lappy(df,setDT)
将对象转换为data.table
。注意,如果您首先将对象创建为data.table,则不需要此步骤,这将是一个更典型的工作流
然后可以使用
lapply(df, setkey, 'name')
# [[1]]
# name height
# 1: George 65
# 2: John 60
# 3: Paul 58
# 4: Ringo 55
#
# [[2]]
# name height
# 1: Arthur 60
# 2: Edward 50
# 3: Frank 55
# 4: Tony 65
您熟悉dplyr
软件包吗?您可以将arrange
函数放入lappy
中
lapply(df, arrange, -height)
如果您不熟悉dplyr
,我会研究它。听起来您的问题可以通过bind_rows
和group_by
解决。其他软件包会简化这一点。如果您想使用base,您可以扩展Map()
:
是的,这是正确的。另外,一般来说,在列表对象上使用lappy或Map函数时,如何正确地向“[”函数提供参数。
order <- lapply(df, with, order(name))
Map("[", df, order, TRUE)
#pseudo translation: df[order, TRUE]
## where TRUE will repeat and select all columns of df
lapply(df, function(x) x[order(x[["name"]]), ])
#or
fx_reorder = function (x, col){
x[order(x[[col]]), ]
}
lapply(df, fx_reorder, "name")
## or to accept multiple columns
fx_reorder2 = function(x, cols) {
if (missing(cols)) cols = names(x)
x[do.call("order", x[cols]), ]
}
lapply(df, fx_reorder2)
lapply(df, fx_reorder2, "name")
lapply(df, fx_reorder2, 1:2)