R 如何在中的循环中获取摘要
我试图在一个循环中计算汇总统计数据(平均值、中位数、最小值、最大值),但不知何故,下面的循环没有运行。任何帮助都将不胜感激R 如何在中的循环中获取摘要,r,R,我试图在一个循环中计算汇总统计数据(平均值、中位数、最小值、最大值),但不知何故,下面的循环没有运行。任何帮助都将不胜感激 sstat% 总结(比率=x(比率), 比率=x(比率) 桌子 } #我需要计算的汇总统计数据: stats我稍微更改了您的代码,但我认为现在它可以正常工作了: df% 分析(文本=)%>% eval()%>% sstat(df),%%>% 打印() } 由于您没有提供任何数据,我只是创建了一个带有一些伪值的data.frame,并相应地更改了您的函数sstat 函数ss
sstat%
总结(比率=x(比率),
比率=x(比率)
桌子
}
#我需要计算的汇总统计数据:
stats我稍微更改了您的代码,但我认为现在它可以正常工作了:
df%
分析(文本=)%>%
eval()%>%
sstat(df),%%>%
打印()
}
由于您没有提供任何数据,我只是创建了一个带有一些伪值的data.frame,并相应地更改了您的函数sstat
函数sstat
现在将数据和函数作为输入,并返回汇总表
for循环使用stat
作为变量,而不是stats
。除非你真的想做一些奇怪的事情,否则你不能同时使用stats
作为变量和序列
函数名由stats
作为字符串提供。eval(parse(text=)
语句使用这个字符串并运行它们
根据预期的输出,有几种方法可以删除for循环。尝试使用*应用-功能:
sapply(stats,function(stat)sstat(df,eval(parse(text=stat)))
#或
lappy(stats,function(stat)sstat(df,eval(parse(text=stat)))
避免eval(解析(文本=)
您可以使用get(stat)
而不是eval(parse(text=stat))
我对您的代码做了一些更改,但我认为现在它可以正常工作了:
df%
分析(文本=)%>%
eval()%>%
sstat(df),%%>%
打印()
}
由于您没有提供任何数据,我只是创建了一个带有一些伪值的data.frame,并相应地更改了您的函数sstat
函数sstat
现在将数据和函数作为输入,并返回汇总表
for循环使用stat
作为变量,而不是stats
。除非你真的想做一些奇怪的事情,否则你不能同时使用stats
作为变量和序列
函数名由stats
作为字符串提供。eval(parse(text=)
语句使用这个字符串并运行它们
根据预期的输出,有几种方法可以删除for循环。尝试使用*应用-功能:
sapply(stats,function(stat)sstat(df,eval(parse(text=stat)))
#或
lappy(stats,function(stat)sstat(df,eval(parse(text=stat)))
避免eval(解析(文本=)
与使用eval(parse(text=stat))
不同,您可以将get(stat)
与dplyr::summary()
一起使用。以下代码获取输入数据帧和列,并计算指定列上的多个统计信息
library(dplyr)
sumstats <- function(df,colName){
df %>% summarise(minimum = min({{colName}}),
avg = mean({{colName}}),
med = median({{colName}}),
maximum = max({{colName}}))
}
sumstats(mtcars,mpg)
最初的问题包括一个数据子集的步骤。我们可以将筛选器表达式作为可选参数添加到sumstats()
函数中,使用missing()
函数检查它,并有条件地对数据进行子集设置。我们还将计算统计中使用的观察值的数量,以便我们可以看到对数据进行分组对结果的影响
sumstats <- function(df,colName,aFilter=NULL) {
if(missing(aFilter)) subset <- df
else subset <- filter(df,{{aFilter}})
subset %>%
summarise(n = n(),
minimum = min({{colName}}),
avg = mean({{colName}}),
med = median({{colName}}),
maximum = max({{colName}}))
}
其次,我们将运行4缸汽车的汇总统计数据
> sumstats(mtcars,mpg,cyl == 4)
n minimum avg med maximum
1 11 21.4 26.66364 26 33.9
>
我们将通过使用不同的方法检查平均值和观察数来验证结果
> # check the mean
> mean(mtcars$mpg[mtcars$cyl == 4])
[1] 26.66364
> # check number of obs
> nrow(mtcars[mtcars$cyl ==4,])
[1] 11
>
使用dplyr::summary()
。以下代码获取输入数据帧和列,并计算指定列上的多个统计信息
library(dplyr)
sumstats <- function(df,colName){
df %>% summarise(minimum = min({{colName}}),
avg = mean({{colName}}),
med = median({{colName}}),
maximum = max({{colName}}))
}
sumstats(mtcars,mpg)
最初的问题包括一个数据子集的步骤。我们可以将筛选器表达式作为可选参数添加到sumstats()
函数中,使用missing()
函数检查它,并有条件地对数据进行子集设置。我们还将计算统计中使用的观察值的数量,以便我们可以看到对数据进行分组对结果的影响
sumstats <- function(df,colName,aFilter=NULL) {
if(missing(aFilter)) subset <- df
else subset <- filter(df,{{aFilter}})
subset %>%
summarise(n = n(),
minimum = min({{colName}}),
avg = mean({{colName}}),
med = median({{colName}}),
maximum = max({{colName}}))
}
其次,我们将运行4缸汽车的汇总统计数据
> sumstats(mtcars,mpg,cyl == 4)
n minimum avg med maximum
1 11 21.4 26.66364 26 33.9
>
我们将通过使用不同的方法检查平均值和观察数来验证结果
> # check the mean
> mean(mtcars$mpg[mtcars$cyl == 4])
[1] 26.66364
> # check number of obs
> nrow(mtcars[mtcars$cyl ==4,])
[1] 11
>
尝试for(stats in stats)
并使用stat
而不是stats[stats]
。你想做什么?for循环和您的表定义之间的连接在哪里?谢谢您的建议。对不起,我没有错误地发布整个代码。我正在更新它。我遵循了你之前的建议,但它仍然不起作用尝试for(stat in stats)
并使用stat
而不是stats[stats]
。你想做什么?for循环和您的表定义之间的连接在哪里?谢谢您的建议。对不起,我没有错误地发布整个代码。我正在更新它。我听了你先前的建议,但还是不管用。这并不能完全解决我想要的问题。但这是解决问题的另一个好方法。非常感谢您的帮助。@SaurabhDatta-谢谢您的反馈,Saurabh。对于大数据量,在数据帧的一次传递中计算多个统计信息的解决方案将比必须多次循环相同数据的解决方案运行得更快。例如,如果我们构建1000万行随机数据,并通过Martin的解决方案和我的解决方案运行它,我的解决方案的运行速度大约快20%。对于单个专栏来说,这并不重要,但是如果你打算以这种方式总结数百个专栏,那么改进的响应时间就变得有意义了。再次感谢Len。我完全同意你的意见。我目前正在处理一个小数据集,但将来计划应用于大数据集。您的解决方案对m非常有用