R применить вектор функций к фрейму данных - PullRequest
1 голос
/ 02 апреля 2020

В настоящее время я работаю над фреймом данных с необработанными цифрами c данных в столбцах. Каждый столбец содержит данные для одного параметра (например, данные экспрессии гена гена xyz), в то время как каждая строка содержит тему. Некоторые данные в столбцах обычно распределяются, а некоторые далеки от этого. Я запустил тесты Шапиро, используя команду apply с полем 2 для различных преобразований, а затем выбрал подходящие преобразования, сравнив shapiro.test () $ p.value. Я отправил свой выбор как char в вектор, дав мне вектор NA, log10, sqrt с длиной ncol (DataFrame). Теперь мне интересно, можно ли применить вектор к фрейму данных с помощью функции apply или, если необходимо, для -l oop. Как мне это сделать или есть лучший способ? Я думаю, я мог бы сделать oop операторы if-else, но должны быть более эффективные способы, потому что мой код уже работает медленно.

Спасибо всем!

Обновление: я попробовал код ниже но он дает мне «Ошибка в файле (имя файла,« r »): неверный аргумент« description »»

TransformedExampleDF <- apply(exampleDF, 2 , function(x) eval(parse(paste(transformationVector , "(" , x , ")" , sep = "" ))))

exampleDF <- as.data.frame(matrix(c(1,2,3,4,1,10,100,1000,0.1,0.2,0.3,0.4), ncol=3, nrow = 4))

transformationVector <- c(NA, "log10", NA)

1 Ответ

1 голос
/ 02 апреля 2020

Так что вы могли бы сделать что-то вроде этого. В приведенном ниже примере я подготовил четыре случайные функции, имена которых я затем сохранил в списке func_list ( Примечание: последняя функция преобразует данные в NA; это преднамеренно ).

Затем я создал другую функцию func_to_df(), которая принимает data.frame и список функций (func_list) в качестве входных данных и применяет (т.е. выполняет с использованием get()) функции к соответствующим столбец data.frame. Выходные данные возвращаются (и в этом примере они сохраняются в data.frame my_df1.

tl; dr: , просто посмотрите, что делает func_to_df(). Это также может быть стоит заглянуть в пакет purrr (хотя он здесь не использовался).

#---------------------

#Example function 1
myaddtwo <- function(x){
  if(is.numeric(x)){
    x = x+2
  } else{
    warning("Input must be numeric!")
  }
  return(x)
  #Constraints such as the one shown above
  #can be added elsewhere to prevent
  #inappropriate action
}

#Example function 2
mymulttwo <- function(x){
  return(x*2)
}

#Example function 3
mysqrt <- function(x){
  return(sqrt(x))
}

#Example function 4
myna <- function(x){
  return(NA)
}

#---------------------

#Dummy data
my_df <- data.frame(
  matrix(sample(1:100, 40, replace = TRUE), 
         nrow = 10, ncol = 4), 
  stringsAsFactors = FALSE)

#User somehow ascertains that
#the following order of functions
#is the right one to be applied to the data.frame
my_func_list <- c("myaddtwo", "mymulttwo", "mysqrt", "myna")

#---------------------

#A function which applies
#the functions from func_list
#to the columns of df
func_to_df <- function(df, func_list){
  for(i in 1:length(func_list)){
    df[, i] <- get(func_list[i])(df[, i])
    #Alternative to get()
    #df[, i] <- eval(as.name(func_list[i]))(df[, i])
  }
  return(df)
}

#---------------------

#Execution

my_df1 <- func_to_df(my_df, my_func_list)

#---------------------

#Output
my_df
#    X1 X2 X3 X4
# 1   8 85  6 41
# 2  45  7  8 65
# 3  34 80 16 89
# 4  34 62  9 31
# 5  98 47 51 99
# 6  77 28 40 72
# 7  24  7 41 46
# 8  45 80 75 30
# 9  93 25 39 72
# 10 68 64 87 47

my_df1
#     X1  X2       X3 X4
# 1   10 170 2.449490 NA
# 2   47  14 2.828427 NA
# 3   36 160 4.000000 NA
# 4   36 124 3.000000 NA
# 5  100  94 7.141428 NA
# 6   79  56 6.324555 NA
# 7   26  14 6.403124 NA
# 8   47 160 8.660254 NA
# 9   95  50 6.244998 NA
# 10  70 128 9.327379 NA

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