Повторение функции для ряда значений - PullRequest
0 голосов
/ 03 марта 2020

У меня есть вопрос, который, вероятно, прост, но я новичок в программировании и пытаюсь понять, как это сделать. Мне нужно запустить пользовательскую функцию для каждого значения переменной.

У меня есть набор данных, который выглядит примерно так

library(plm)
data("Grunfeld")
Grunfeld$quadri <- as.numeric(cut2(Grunfeld$year, g=4))

Grunfeld<-Grunfeld %>% select(-c(value,capital))

Я написал функцию, которую я должен применить к каждому из значений в quadri, которая выглядит примерно так

simil<- function(dataset,number){ # I create a function that calculates role equivalence

  sim_n <- dataset %>% filter(quadri==number) %>%select(-quadri) # the function is calculated for every year

  ### I need to spread the data before making correlation
  wide_n <- sim_n %>% spread (firm, inv)

  #To deal with NA, I follow the literature and consider those as 0s
  wide_n[is.na(wide_n)] <- 0
  cor_n <- as.data.frame(cor(wide_n[,(2:ncol(wide_n))]))

  # then i gather the data in long from
  sim_fin_n <- data.frame( # create a dataframe
    firm= rep(rownames(cor_n)[row(cor_n)]),
    `cmp_firm`= rep(colnames(cor_n)[col(cor_n)]),
    `sim_inv`=unlist(cor_n),
    stringsAsFactors=FALSE)
  rownames(sim_fin_n) <- NULL
  sim_fin_n<-sim_fin_n%>%filter(firm!=cmp_firm)
} 

Я хотел бы повторить свою функцию для всех значений в quadri. Я мог бы сделать это одно за другим, но это было бы неэффективно, потому что в реальных данных у меня есть сотни значений

# one by one
sim1<-simil(Grunfeld,1)%>% mutate(quadri=1)
sim2<-simil(Grunfeld,2)%>% mutate(quadri=2)
sim3<-simil(Grunfeld,3)%>% mutate(quadri=3)
sim4<-simil(Grunfeld,4)%>% mutate(quadri=4)

Я хотел бы запустить функцию для каждого значения в quadri возможно, мне нужен для l oop или функции применения, но я изо всех сил пытаюсь понять, как.

Я посмотрел вокруг, и этот вопрос похож, R повторяет функцию , но я не могу применить ответ к своему делу

Заранее большое спасибо за Ваша помощь

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 03 марта 2020

Простым решением является использование пакета purrr.

library(Hmisc)
library(purrr)
library(plm)

simil<- function(dataset,number){ 

  sim_n <- dataset %>% 
             filter(quadri==number) %>%
             select(-quadri) 

  wide_n <- sim_n %>% spread (firm, inv)

  wide_n[is.na(wide_n)] <- 0
  cor_n <- as.data.frame(cor(wide_n[,(2:ncol(wide_n))]))

  sim_fin_n <- data.frame( 
       firm= rep(rownames(cor_n)[row(cor_n)]),
       `cmp_firm`= rep(colnames(cor_n)[col(cor_n)]),
       `sim_inv`=unlist(cor_n),
       stringsAsFactors=FALSE)
       rownames(sim_fin_n) <- NULL

  sim_fin_n<-sim_fin_n %>% 
               filter(firm!=cmp_firm) %>%
               mutate(quadri = number) # Add to function!

}

Затем вы можете использовать map_dfr (), чтобы применить функцию несколько раз, и связать результаты строк вместе в data.frame:

purrr::map_dfr(1:4, ~simil(Grunfeld, .))

Редактировать:

Альтернативный способ использования lapply:

x <- lapply(1:4, function(x) simil(Grunfeld, x))
do.call(rbind, x)
...