我试图摆脱tidyverse和dplyr方法的困扰,并希望将以下函数应用于数据框/数据表的每一列:
library(multimode)
funx <- function(x) {multimode::modetest(x, method = 'SI') }
然后尝试使用诸如summary_all之类的内容开始,但是我立即收到错误消息:
错误:列的
mpg
长度必须为1(汇总值),而不是8
library(dplyr)
mtcars %>%
summarise_all(funx)
我希望最终得到一个新的数据框,该数据框显示在第1列中测试的colname和在第modetest
2列中的p值
从昨天(23-05-2019)更新软件包后,我的解决方案无法正常工作,下面的代码现在显示为'。' 点而不是列名提交了一个帖子到github页面来询问这种改变的原因:github
library(multimode)
funx <- function(x) {
print(substitute(x))
multires <- multimode::modetest(x, method = 'SI')
p <- multires$p.value}
mtcars %>%
select(1:2) %>%
summarise_all(list(~ funx(.)))
具有讽刺意味的更新,在获得有关github帖子的反馈后,使用新版本,我们现在可以执行以下操作:
mtcars %>%
select(1:2) %>%
summarise_all(funx)
如您所见,它与我发布问题时开始的语法完全相同。因此,我想说dplyr团队所做的出色工作使语法更加“自然”。
所述summarise
可输出仅与单个元件。根据?summarise
创建一个或多个标量变量,以汇总现有tbl的变量。具有由group_by()创建的组的Tbl将在每个组的输出中导致一行。没有组的Tbl将导致一行。
因此,如果输出大于长度1,则将其包装在list
和unnest
library(dplyr)
out <- mtcars %>%
summarise_all(list(~ list(funx(.))))
如果我们要提取单个值,例如p.value
,则无需将其包装在list
out1 <- mtcars %>%
select(1:2) %>%
summarise_all(list(~ funx(.)$p.value))
out1
# mpg cyl
#1 0.718 0.244
可以将其转换为两列数据集 gather
library(tidyr)
gather(out1, colName, pvalue) %>%
arrange(pvalue)
通过检查modetest
单列上的输出
funx(mtcars[[1]])
# Silverman (1981) critical bandwidth test
#data: x
#Critical bandwidth = 2.5413, p-value = 0.716
#alternative hypothesis: true number of modes is greater than 1
它不是单个值输出,而是摘要模型输出。因此,最好将其存储在中list
,但是,我们可以提取特定的组件(p-value
)并将其输出到summarise
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句