在R语言自定义函数中拆分DataFrame的问题求助
解决R语言自定义拆分DataFrame函数的错误问题
错误原因分析
- 你使用的
dataframe${{SUB1}}是错误语法,R中没有这种数据框索引方式,按变量名索引数据框应使用[[ ]](支持动态变量名)或$(仅支持固定列名)。 - 调用
sub1(AGEGR1)时,R会将AGEGR1视为独立对象查找,但它只是数据框的列名,并非全局对象,因此会出现"对象未找到"的错误。
解决方案
方法1:传入列名字符串,用[[ ]]索引
这是最直观的基础写法,适合新手:
dataframe <- as.data.frame(cbind( ID = c(1, 2, 3, 4, 5, 6), TRT01AN = c(1, 1, 3, 2, 2, 2), AGEGR1 = c("Adult", "Child", "Adolescent", "Adolescent", "Adolescent", "Child") )) sub1 <- function(col_name) { split(dataframe, dataframe[[col_name]]) } # 调用时传入列名字符串 list1 <- sub1("AGEGR1")
方法2:使用非标准计算支持直接传列名
如果想保留直接传列名(不用加引号)的写法,可借助rlang包的非标准计算工具:
library(rlang) dataframe <- as.data.frame(cbind( ID = c(1, 2, 3, 4, 5, 6), TRT01AN = c(1, 1, 3, 2, 2, 2), AGEGR1 = c("Adult", "Child", "Adolescent", "Adolescent", "Adolescent", "Child") )) sub1 <- function(col) { col_expr <- enquo(col) split(dataframe, !!col_expr) } # 直接传列名即可 list1 <- sub1(AGEGR1)
方法3:基础R实现非标准计算写法
无需额外包,用substitute也能实现直接传列名:
dataframe <- as.data.frame(cbind( ID = c(1, 2, 3, 4, 5, 6), TRT01AN = c(1, 1, 3, 2, 2, 2), AGEGR1 = c("Adult", "Child", "Adolescent", "Adolescent", "Adolescent", "Child") )) sub1 <- function(col) { col_name <- substitute(col) split(dataframe, dataframe[[col_name]]) } list1 <- sub1(AGEGR1)
验证结果
运行任意一种方法后,执行str(list1)可查看拆分结果,list1会按指定列拆分为对应分组的DataFrame列表。
内容的提问来源于stack exchange,提问作者Julien Lamantia
相关产品推荐
相关产品推荐

