Функция для перебора общих имен переменных с разными суффиксами в R - PullRequest
0 голосов
/ 06 августа 2020

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

Предположим, что 3 страны в качестве простого примера:

country_list <- c('ALB', 'ARE', 'ARG') 

I Я пытаюсь создать серию переменных под названием a_m5_ALB, a_m5_ARE, a_m5_ARG et c, которые имеют различные функции, например addcol или round_df, применяемые к reg_math_ALB, reg_math_ARE, reg_math_ARG et c

for (i in country_list) {
 
  paste("a_m5", i , sep = "_")  <- addcol(paste("reg_math", i , sep = "_"))

}

for (i in country_list) {
 
  paste("a_m5", i , sep = "_")  <- round_df(paste("reg_math", i , sep = "_"))

}


где addcol и round_df определяются как:

addcol = function(y){
    dat1 = mutate(y, p.value = ((1 - pt(q = abs(reg.t.value), df = dof))*2))
    return(dat1)
}

round_df <- function(x, digits) {
    numeric_columns <- sapply(x, mode) == 'numeric'
    x[numeric_columns] <-  round(x[numeric_columns], digits)
    x
}

Ошибки l oop, когда любая из функций добавляется в скобки перед часть переменной вставки, но она работает, если делать это вручную, например,

a_m5_ALB <- addcol(reg_math_ALB)

Не могли бы вы помочь? Я думаю, что это приложение функции в al oop, которое я ошибаюсь.

Ошибки:

Error in UseMethod("mutate_") : 
  no applicable method for 'mutate_' applied to an object of class "character"

Error in round(x[numeric_columns], digits) : 
  non-numeric argument to mathematical function

Спасибо

1 Ответ

0 голосов
/ 06 августа 2020

Судя по вашим примерам, вы действительно находитесь в том случае, когда все должно быть в одном фрейме данных. Здесь хранение отдельных переменных для каждой страны - не лучший инструмент для работы. Скажем, у вас есть кадры данных для каждой страны, сохраненные как csv, вы можете переписать все как:

library(tidyverse)
country_list <- c('ALB', 'ARE', 'ARG') 

read_data <- function(ctry){
  read_csv(paste0("/path/to/file/", "reg_math_", ctry)) %>%
  add_column(country = ctry)
}

total_df <- map_dfr(country_list, read_data)

total_df %>%
  mutate(p.value = (1 - pt(q = abs(reg.t.value), df = dof))*2) %>%
  mutate(across(where(is.numeric), round, digits = digits))

И это дает вам немедленный доступ ко всем другим dplyr функциям, которые отлично подходят для такого рода манипуляций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...