R中的函数参数定义问题

3

这里是我的问题,当我想要开发一个供广泛使用的函数时。

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

我想使用第一种定义方式,其中变量名称参数在“括号”中而不是“datafile $ variablename”中。


这个问题似乎已经被问过了。 - hadley
我没有找到完全相同的问题,但在这里看到了一个类似但不同的问题 - https://dev59.com/nF3Ua4cB1Zd3GeqP-TVc,希望这不是导致投票下降的原因!如果有人能指引我找到相同的问题,我甚至会关闭这个帖子... - jon
2个回答

6
你只需要不使用$作为列选择器,而是使用[:


dataframe[,A]

或者
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

谢谢您的友善回答,我想知道"$"和[C1]列选择器之间的区别? - jon
dataframe$A 搜索名为“A”的列。如果A包含一个字符串,则 dataframe[,A] 搜索名为A所包含的任何内容的列。 - Dason
“R地狱”一书的第8.1.39节可能会有所帮助。http://www.burns-stat.com/pages/Tutor/R_inferno.pdf - Patrick Burns

3
直接回答你的问题是使用[索引而不是$索引,因为$索引不允许间接子集选择。
此外,您可以通过使用单个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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接