R语言使用map_dfr给列表数据框加列中位数行及!!!用法咨询
问题分析与解答
代码无法运行的核心原因
- 参数错位语法错误:你通过管道符把
list_df传递给了map_dfr的第一个参数(待迭代的列表对象),此时写在第二个位置的[,1:4]会被R识别为map_dfr要应用的迭代函数,而[,1:4]本身不是合法的函数对象,直接触发语法报错,这是代码无法运行的最直接原因。 - 非数值列计算隐患:即使修正语法错误,直接对整个dataframe运行
map(., median)会包含非数值列(此场景下为Species字符列),median计算字符列会返回NA,不符合你的需求。 - 如果此前运行正常,大概率是之前的测试场景中列表内的dataframe没有非数值列,且参数写法和当前有误的版本不一致。
!!!操作符的具体作用
!!!是rlang包提供的大爆炸操作符(Big Bang Operator),作用是将列表内的所有元素拆解为独立的命名参数传递给调用函数。
在你的需求场景中,map(select(., where(is.numeric)), median)会返回一个和数值列长度一致的命名列表,每个元素对应一列的中位数,格式为list(Sepal.Length = xx, Sepal.Width = xx, Petal.Length = xx, Petal.Width = xx)。!!!会把这个列表直接拆解为Sepal.Length = xx, Sepal.Width = xx...形式的独立参数,刚好匹配add_row()接受「列名=值」的传参规则,不需要你手动逐个指定列的中位数。
可正常运行的修正代码
# 版本1:保留原列表结构,中位数行的Species列标注为median,方便区分 library(tidyverse) list_df %>% map(~ .x %>% add_row( Species = "median", !!!map(select(., where(is.numeric)), median) )) # 版本2:不需要保留原列表,直接合并为单个dataframe list_df %>% map_dfr(~ .x %>% add_row( Species = "median", !!!map(select(., where(is.numeric)), median) )) # 版本3:不需要保留Species列,直接对前4列计算中位数 list_df %>% map(~ .x %>% select(1:4) %>% add_row(!!!map(., median)))
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

