Ошибка при создании функции в R - PullRequest
0 голосов
/ 08 мая 2018

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

Мои данные (df) выглядят так:

  WEEK1.x WEEK1.y WEEK2.x WEEK2.y WEEK3.x WEEK3.y
1  660.14       1  690.74       2  821.34       1
2 -482.89      99 -368.12      99 -368.12      99
3  284.48       3  399.90       1  375.32       1
4 -554.18      99 -300.28      99 -300.28      99

Тогда моя функция выглядит следующим образом:

  extra<-function(first_var, second_var){
  df$first_var=ifelse((df$first_var == 99),"99",
                      ifelse((df$first_var %in% c(1,2,3,4,5)),"1-5",NA))
  output=as.data.frame(aggregate(second_var~first_var, data = df, mean))
  return(output)
 }
  WEEK1<-extra("WEEK1.y", "WEEK1.x")
  WEEK2<-extra("WEEK2.y", "WEEK2.y")

Это дает мне ошибку:

Ошибка в $<-.data.frame (*tmp*, first_var, значение = логическое (0)):
замена имеет 0 строк, данные имеют 1416

Когда я нажимаю просмотр трассировкивот что он говорит:

stop (sprintf (ngettext (N, "замена имеет% d строку, данные имеют% d", "замена имеет% d строки, данные имеют% d"), N, nrows), домен = NA) $<-.data.frame (*tmp*, first_var, значение = логическое (0)) $<- (*tmp*, first_var, значение = логическое (0)) дополнительно("WEEK1.y", "WEEK1.x")

Я не уверен, в чем проблема?

1 Ответ

0 голосов
/ 08 мая 2018

Вот рабочая версия вашей функции.
Я использовал вариант предложения @ A.Suliman, но с [[.

extra <- function(first_var, second_var){
  df[[first_var]] <- ifelse((df[[first_var]] == 99), "99",
                      ifelse((df[[first_var]] %in% c(1,2,3,4,5)), "1-5", NA))
  fmla <- as.formula(paste(second_var, first_var, sep = "~"))
  aggregate(fmla, data = df, mean, na.rm = TRUE)
}

WEEK1 <- extra("WEEK1.y", "WEEK1.x")
WEEK1
#  WEEK1.y  WEEK1.x
#1     1-5  472.310
#2      99 -518.535


WEEK2 <- extra("WEEK2.y", "WEEK2.x")
WEEK2
#  WEEK2.y WEEK2.x
#1     1-5  545.32
#2      99 -334.20

Обратите внимание, что я бы также посоветовал передать df в качестве аргумента функции. Обычно считается плохой практикой полагаться на объекты, существующие не в среде функции, а в других местах. В этом случае df существует в .GlobalEnv, и вы заставляете R покинуть среду, в которой это необходимо, чтобы найти ее.

DATA.

df <- read.table(text = "
  WEEK1.x WEEK1.y WEEK2.x WEEK2.y WEEK3.x WEEK3.y
1  660.14       1  690.74       2  821.34       1
2 -482.89      99 -368.12      99 -368.12      99
3  284.48       3  399.90       1  375.32       1
4 -554.18      99 -300.28      99 -300.28      99
", header = TRUE)
...