首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R如何为函数设置数据框?

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

Stack Overflow用户
提问于 2015-05-06 15:13:18
回答 3查看 83关注 0票数 1

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

我已经让函数正常工作了,但是每个变量都必须作为数据集的一列单独引用,例如。数据$d1等。我想知道如何让它更清晰,这样函数就有了自己的数据和参数,这样数据集的名称就只需要给出一次。以同样的方式,假设aov {stats}包工作,其中列出列并设置数据帧。AOV示例(Val,Location是数据集列):

代码语言:javascript
复制
aov(Val~Location, data=starlings)

我的函数:

代码语言:javascript
复制
#' 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的列):

代码语言:javascript
复制
PCQ(1,dat$D1,dat$D2,dat$D3,dat$D4)

我试着让函数有一个变量"D“来保存数据集的名称,然后在函数中有$D1等,但都不起作用。

代码语言:javascript
复制
PCQ <- function(D,A,D1,D2,D3,D4){
      return(A^2/((D$D1+D$D2+D$D3+D$D4)/4)^2)
    } 

很抱歉,第一次编辑不够清晰。

EN

回答 3

Stack Overflow用户

发布于 2015-05-06 15:19:27

或者试试这个

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-05-06 15:18:50

尝尝这个

代码语言:javascript
复制
PCQ <- function(data,A,D1,D2,D3,D4){
  return(A^2/((data[,D1] + data[,D2] + data[,D3] + data[,D4])/4)^2)
  }

此函数可用作

代码语言:javascript
复制
PCQ(data = dat,1,"P.1st","P.2nd","P.3rd","P.4th")
票数 0
EN

Stack Overflow用户

发布于 2015-05-06 16:57:58

要将多个列名传递给函数而不用引号,我们可以利用package lazyeval的优点

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30069916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档