繁体   English   中英

有没有办法将两个不同的函数组合成 R 中的一个函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM