如何用lapply对数据框列表中每个数据框的指定列排序?
解决lapply遍历数据框列表时按指定列排序的问题
问题背景
你尝试用lapply对拆分后的iris数据集列表中每个数据框的指定列排序,但自定义函数和调用方式存在问题,导致报错或结果不符合预期。
你的原自定义函数:
my_function = function(individual_dataframe, logical_condition, column_to_order){ output_dataframe = if(logical_condition == T){ individual_dataframe[order(column_to_order,decreasing = F),] }else { individual_dataframe[order(column_to_order,decreasing = T),] } return(ordered_dataframe) }
拆分数据集的代码:
iris_species = split(iris, iris$Species)
你尝试的错误调用:
# 错误写法1:手动指定第一个参数导致下标错误 ordered_iris_species = lapply(iris_species, FUN = my_function(df = iris_species[[]], increasing_order = F, column_to_order = Sepal.length)) # 错误写法2:固定引用第一个数据框的列,导致所有数据框用同一列排序 ordered_iris_species = lapply(iris_species, FUN = my_function, increasing_order = F, column_to_order = iris_species[[1]]$Sepal.length))
解决步骤
1. 修正自定义函数
原函数存在三个问题:
- 返回变量名错误(
output_dataframe写成了ordered_dataframe) - 未从传入的数据框中获取目标列,直接使用
column_to_order会导致对象找不到 - 参数名与调用时的参数不匹配(函数用
logical_condition,调用时用increasing_order)
修正后的函数:
my_function = function(individual_dataframe, increasing_order, column_to_order){ output_dataframe = if(increasing_order){ # 从当前数据框中提取目标列进行排序 individual_dataframe[order(individual_dataframe[[column_to_order]], decreasing = FALSE), ] } else { individual_dataframe[order(individual_dataframe[[column_to_order]], decreasing = TRUE), ] } return(output_dataframe) }
2. 正确调用lapply
lapply会自动将列表中的每个元素(即每个数据框)作为第一个参数传给my_function,你只需要指定剩余的固定参数即可:
# 按Sepal.Length降序排序每个数据框 ordered_iris_species = lapply(iris_species, FUN = my_function, increasing_order = FALSE, column_to_order = "Sepal.Length")
3. 简化写法(可选)
如果不想写自定义函数,直接用匿名函数更简洁:
# 降序排序Sepal.Length ordered_iris_species = lapply(iris_species, function(df) { df[order(df$Sepal.Length, decreasing = TRUE), ] })
或者用dplyr+purrr的管道风格:
library(dplyr) library(purrr) # 降序排序 ordered_iris_species = iris_species %>% map(arrange, desc(Sepal.Length)) # 升序排序则去掉desc() ordered_iris_species = iris_species %>% map(arrange, Sepal.Length)
内容的提问来源于stack exchange,提问作者Shake-N-Bake
相关产品推荐
相关产品推荐

