проблема с определением аргумента функции в R

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

dataframe1 <- data.frame(V1 = 1:10, V2 = 11:20, V3 = 21:30, V4 = 31:40)
myfun <- function (dataframe, A, B, yvar) {
                  dataframe1$A <- as.factor(dataframe$A)
                  dataframe1$B <- as.factor (dataframe$B)
                  dataframe1 <- data.frame(A = dataframe1$A, 
                  B = dataframe1$B, yvar = dataframe1$yvar)
                  print(dataframe1)
                  }

 myfun (dataframe = dataframe1, A = "V1", B= "V2", yvar = "V3")
 Error in `$<-.data.frame`(`*tmp*`, "A", value = integer(0)) :
  replacement has 0 rows, data has 10

myfun (dataframe = dataframe1, A = dataframe1$V1, 
         B= dataframe1$V2, yvar = dataframe1$V3)
Error in `$<-.data.frame`(`*tmp*`, "A", value = integer(0)) :
  replacement has 0 rows, data has 10

Я хотел бы определить, используя первый тип определения, где аргумент имени переменной находится в «круглых скобках» вместо «файл данных $ имя_переменной».


person jon    schedule 19.11.2011    source источник
comment
Вроде этот вопрос уже задавали   -  person hadley    schedule 19.11.2011
comment
Я нашел точный вопрос, я вижу похожий, но другой вопрос по адресу - stackoverflow.com/questions/8121542/, я надеюсь, что это не является причиной отрицательного голосования ! Если кто-то может направить меня на идентичный вопрос, я был бы рад даже закрыть этот пост ...   -  person jon    schedule 19.11.2011


Ответы (2)


Вам просто нужно не использовать $ в качестве селектора столбца. Вместо этого используйте [:

dataframe[,A]

or

dataframe[,B]

и так далее. В твоем случае:

dataframe1 <- data.frame(V1 = 1:10, V2 = 11:20, V3 = 21:30, V4 = 31:40)
myfun <- function (dataframe, A, B, yvar) {
                   dataframe1[,A] <- as.factor(dataframe[,A])
                   dataframe1[,B] <- as.factor (dataframe[,B])
                   dataframe1 <- data.frame(A = dataframe1[,A], 
                   B = dataframe1[,B], yvar = dataframe1[,yvar])
                   print(dataframe1)
                   }

myfun (dataframe = dataframe1, A = "V1", B= "V2", yvar = "V3")

    A  B yvar
1   1 11   21
2   2 12   22
3   3 13   23
4   4 14   24
5   5 15   25
6   6 16   26
7   7 17   27
8   8 18   28
9   9 19   29
10 10 20   30
person joran    schedule 19.11.2011
comment
спасибо за приятный ответ, интересно, какая разница в селекторах столбцов $ и [, C1]? - person jon; 19.11.2011
comment
dataframe$A ищет столбец с именем A. Если A содержит строку, тогда dataframe[,A] ищет столбец с именем, которое содержит A. - person Dason; 19.11.2011
comment
Круг 8.1.39 из «The R Inferno» может помочь. burns-stat.com/pages/Tutor/R_inferno.pdf - person Patrick Burns; 19.11.2011

Прямой ответ на ваш вопрос — использовать индексирование [, а не индексирование $, поскольку индексирование $ не допускает косвенного подмножества.

Кроме того, вы можете существенно улучшить читабельность вашей функции, используя один оператор data.frame без определения каких-либо промежуточных переменных:

myfun <- function (dataframe, A, B, yvar) {
  data.frame(
      A = as.factor(dataframe[, A]), 
      B = as.factor(dataframe[, B]),
      yvar = dataframe[, yvar]
  )
}

myfun(dataframe1, "V1", "V2", "V3")
    A  B yvar
1   1 11   21
2   2 12   22
3   3 13   23
4   4 14   24
5   5 15   25
6   6 16   26
7   7 17   27
8   8 18   28
9   9 19   29
10 10 20   30
person Andrie    schedule 19.11.2011