R如何为函数设置数据框?

时间:2015-05-06 07:13:18

标签: r

我正在尝试为R编写一个包,我打算在excel中做这个,但我想学习如何制作一个基本的包会很有趣,并且有很好的知识。

我已经使该函数工作,但是每个变量必须作为一个列单独引用数据集,例如。 DATA $ D1等我想知道如何使它更干净,所以函数有数据有自己的参数,这样数据集的名称只需要给出一次。以同样的方式说aov {stats}包工作,列出列并设置数据框。 AOV示例(Val,Location是数据集starling的列):

aov(Val~Location, data=starlings)

我的功能:

#' Run PCQ Density Calculation
#' Take four distance measurements and specified area and estimate density.
#' @param A = Specified Area (i.e. 1m^2 or 1 hectare (10,000 m^2))
#' @param D1 = Quarter 1 Distance
#' @param D2 = Quarter 2 Distance
#' @param D3 = Quarter 3 Distance
#' @param D4 = Quarter 4 Distance
#' @return The density esitmation 
#' @export
PCQ <- function(A,D1,D2,D3,D4){
  return(A^2/((D1+D2+D3+D4)/4)^2)
}

我正在使用的功能(D1,D2,D3,D4是数据集dat的列):

PCQ(1,dat$D1,dat$D2,dat$D3,dat$D4)

我试过让函数有一个变量“D”,它将保存数据集的名称,然后在函数中有$ D1等但是没有用。

PCQ <- function(D,A,D1,D2,D3,D4){
      return(A^2/((D$D1+D$D2+D$D3+D$D4)/4)^2)
    } 

很抱歉第一次修改时不够清晰。

3 个答案:

答案 0 :(得分:1)

或试试这个

dat <- data.frame(P.1st = 1:10)
PCQ <- function(df, var1) {
  col <- deparse(substitute(var1))    
  return(cumsum(df[, col]))
}
PCQ(dat, P.1st)
# [1]  1  3  6 10 15 21 28 36 45 55

答案 1 :(得分:0)

试试这个

PCQ <- function(data,A,D1,D2,D3,D4){
  return(A^2/((data[,D1] + data[,D2] + data[,D3] + data[,D4])/4)^2)
  }

此功能可用作

PCQ(data = dat,1,"P.1st","P.2nd","P.3rd","P.4th")

答案 2 :(得分:0)

要将多个列名称传递给函数而不引用它们,我们可以使用包lazyeval

的优点
dat <- as.data.frame(matrix(1:50, ncol = 10, dimnames = list(NULL, paste0("C", 1:10))))
#   C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
# 1  1  6 11 16 21 26 31 36 41  46
# 2  2  7 12 17 22 27 32 37 42  47
# 3  3  8 13 18 23 28 33 38 43  48
# 4  4  9 14 19 24 29 34 39 44  49
# 5  5 10 15 20 25 30 35 40 45  50
PCQ <- function(D, A, ...)
{
  require("lazyeval")
  cols <- lazy_dots(...)
  cols_names <- unlist(lapply(cols, function(x) as.character(x$expr)))

  return( A^2 / (rowSums(D[,cols_names])/4)^2 )
} 

PCQ(dat, 100, C1, C5, C7, C10)
# [1] 16.32486 15.08153 13.97502 12.98596 12.09830

但是可以使用select包中的函数dplyr创建更漂亮的解决方案。

PCQ2 <- function(D, A, ...)
{
  require("dplyr")

  return( A^2 / (rowSums(select(D, ...))/4)^2 )
}

PCQ2(dat, 100, C1, C5, C7, C10)
# [1] 16.32486 15.08153 13.97502 12.98596 12.09830