Включить формулу в пользовательскую функцию - PullRequest
0 голосов
/ 01 февраля 2019

Допустим, я хочу вычислить конкретное значение для строки или группы (в этом примере вопрос это значение является средним), как бы я это сделал?

Personal_mean <- function(observations, data, na.rm){
  #Take obs from data
  observations <- eval(substitute(observations), envir=data)
  #add the observations together
  sum_of_obs <- sum(observations, na.rm=na.rm)
  #adjusts for NA in data 
  if (na.rm==TRUE){
    length_of_obs <- length(observations[!is.na(observations)])
  } else{
    length_of_obs <- length(observations)
  }
# applies above calculations per observation of the object
  m<-0
  for(i in 1:length(observations[!is.na(observations)])){
    m[i]<- sum_of_obs[i]/length_of_obs[i]
  }
  return(m)
}

Я хочу протестировать эту функцию с помощьюследующие примеры данных:

testdata <- data.frame(Gr,O1,O2,O3)
Gr <- c("G1","G2","G3","G4","G5")
O1 <- c(5,7,10,3.5,5)
O2 <- c(4,8,20,NA,3)
O3 <- c(6,NA,18,5.5,2)

Таким образом, это должно дать средние значения 5,7,5,16,4,5 и 3,3 По сути, я хочу, чтобы эта функция делала, чтобы вычислить среднее значение для каждой строки или группы, чтобы иметь возможностьиметь дело с NA в данных, уметь брать наблюдения из предоставленных данных.Всякий раз, когда я пробую этот код, я получаю следующий результат:

[1] 7.461538       NA       NA       NA       NA       NA       NA       NA       NA       NA
[11]       NA       NA       NA

Так что же я не так делаю, что он не работает?

Заранее спасибо!

1 Ответ

0 голосов
/ 01 февраля 2019

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

my_mean<-function(data,func,observations,na.rm=F,exc){
m<-as.data.frame(mget(observations,envir = as.environment(data)))
  if(na.rm==T){

  #m[is.na(m)]<-as.numeric(0)
  res1<-apply(m[complete.cases(m),],1,func)
  m<-m[!complete.cases(m),]
  ms[is.na(ms)]<-0
 res2<-rowSums(ms[,-exc])/2
 return(list(res1=res1,res2=res2))
 #res2  contains mean for rows with NAs
 #exc is the column to exclude ie has non numeric data
  #res1 has mean for all rows with no NAs
  }else{

    apply(m,1,func)
}
}

Тестирование:

my_mean(testdata,mean,c("O1","O2","O3"),na.rm = F,1)


 #  $res1
  #      1         3         5 
  #   5.000000 16.000000  3.333333 

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