如何调整sapply调用以从fitDist函数输出中提取指定内容并生成数据框
如何调整sapply调用以从fitDist函数输出中提取指定内容并生成数据框
你只需要在sapply里传入一个匿名函数,让它对每列数据先运行fitDist,再直接提取你需要的family[2]值就行,不用保留整个结果列表。下面是具体的实现方法:
基础实现
直接修改sapply的第二个参数,把原来的fitDist替换成一个自定义的小函数,专门提取目标内容:
# 生成只包含目标描述的数据框 result_df <- data.frame( Fit_Family = sapply(df, function(col_data) { # 对当前列运行fitDist fit_output <- fitDist(col_data) # 提取你需要的family第二个元素 fit_output$family[2] }) )
这个代码会生成一个数据框,列名是Fit_Family,行名对应原数据框df的每一列名,每个单元格就是对应列拟合后的分布描述(比如你提到的"Exponential generalized beta 2 (i.e. of the second kind)")。
优化:处理拟合失败的情况
如果你的数据里有某些列可能导致fitDist运行失败(比如数据不符合分布要求),可以加上tryCatch来捕获错误,避免整个代码中断:
result_df <- data.frame( Fit_Family = sapply(df, function(col_data) { tryCatch({ fit_output <- fitDist(col_data) fit_output$family[2] }, error = function(e) { # 拟合失败时返回自定义提示 "Fit failed - check data" }) }) )
补充说明
- 原来的
data.frame(sapply(df, fitDist))会把每列的完整fitDist结果列表作为数据框的列,这显然不是你需要的;而通过匿名函数提前提取目标值,sapply会返回一个简单的字符向量,再转成数据框就非常简洁。 - 如果希望结果以列对应原数据框列的形式展示(而不是行),可以用
t()转置一下:
result_df <- as.data.frame(t(sapply(df, function(col_data) { fitDist(col_data)$family[2] })))
备注:内容来源于stack exchange,提问作者TDeramus
相关产品推荐
相关产品推荐

