[英]Is there any way to combine two different functions to one function in R?
我有两个不同的 R 函数(myDat 和 loading)。 有没有办法将这两个函数组合成 R 中的一个函数?
myDat <- function(filename) {
dat <-readModels(filename, what = "parameters")$parameters
dat <- filter(as.data.frame(dat$unstandardized), grepl("BY|Intercepts", paramHeader))
return(dat)
}
dat2 <- myDat("cfa.out")
loading <- function(loading) {
loading <- dat2 %>%
filter(grepl("BY", paramHeader)) %>%
select(c(param, est)) %>%
separate(param, c("loading","time")) %>%
mutate(time = paste0('time',time)) %>%
spread(loading, est)
return(loading)
}
loading(dat2)
为了将来参考,您也许可以提供一些示例数据以展示问题。 当我阅读您的问题时,您正在寻找一种组合两个函数的方法(即h(x) = g(f(x))
。这可以按如下方式完成:
myDat <- function(filename) {
dat <- readModels(filename, what = "parameters")$parameters
dat <- filter(as.data.frame(dat$unstandardized),
grepl("BY|Intercepts", paramHeader))
return(dat)
}
loading <- function(data) {
data %>%
filter(grepl("BY", paramHeader)) %>%
select(c(param, est)) %>%
separate(param, c("loading","time")) %>%
mutate(time = paste0('time',time)) %>%
spread(loading, est)
}
combined <- purrr::compose(loading, myDat)
由reprex 包(v0.3.0) 于 2020 年 1 月 27 日创建
我们可以在一个管道中拥有一切。 提取 'parameters' 后, pull
' data.frame
',转换为data.frame
,然后filter
值为 'BY' 或 'Intercepts' 的 'paramHeader',并与来自第二个函数的管道的其余部分结合
library(dplyr)
library(stringr)
library(tidyr)
loadingNew <- function(filename) {
readModels(filename, what = "parameters")$parameters %>%
pull('unstandardized') %>%
as.data.frame %>%
filter(str_detect(paramHeader, "BY|Intercepts")) %>% # not clear about two filter
filter(grepl("BY", paramHeader)) %>%
select(param, est) %>%
separate(param, c("loading","time")) %>%
mutate(time = str_c('time',time)) %>%
spread(loading, est)
# or use pivot_wider
#pivot_wider(names_from = loading, values_from = est)
}
loadingNew("cfa.out")
非常感谢您提供的所有帮助。 这真的很有帮助。 我终于根据大家的意见和建议做了一个我想要的功能。
MIEstimate <- function(x,n) {
dat <-readModels(x, what = "parameters")$parameters
dat <- filter(as.data.frame(dat$unstandardized), grepl("BY|Intercepts", paramHeader))
if(n == 1) {
# loading
loading <- dat %>%
filter(grepl("BY", paramHeader)) %>%
select(c(param, est)) %>%
separate(param, c("loading","time")) %>%
mutate(time = paste0('time',time)) %>%
# spread(loading, est)
pivot_wider(names_from = "loading",values_from = "est")
return(loading)
} else if(n == 2) {
# intercepts
intercept <- dat %>%
filter(grepl("Intercepts", paramHeader)) %>%
select(c(param, est)) %>%
separate(param, c("intercept","time")) %>%
mutate(time = paste0('time',time)) %>%
# spread(intercept, est)
pivot_wider(names_from = "intercept",values_from = "est")
return(intercept)
}
}
MIEstimate("cfa.out", 1)
MIEstimate("cfametric.out", 2)
不过有一件事....当我使用 spread() 函数时,最终的表时间顺序是这样的 - 不是从小到大的时间 V1 V2 1 time133 1 1.038 2 time175 1 0.988 3 time19 1 0.954 4 time224 1 1.005 5 time29 1 0.974 6 time39 1 1.032 7 time5 1 0.995 8 time51 1 0.998 9 time61 1 0.987 10 time75 1 0.992 11 time91 1 0.987
但 pivot_wider() 工作正常。 有谁知道为什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.