r语言 - 在函数中使用变量来引用 data.frame 中的变量



我需要对 data.frame 中的不同变量应用一系列操作。 为了使我的代码更短、更易于阅读,我正在尝试将这些操作功能化。 但是,我在使用变量(在函数中)引用 data.frame 中的变量时遇到问题。 下面是一个玩具示例:

set.seed(1)
dframe <- data.frame(ID=rep(1:4, each=3),
                     cond=rep(c("a", "b"), each=6), 
                     x=rnorm(12))
dframe
   ID cond          x
1   1    a -0.6264538
2   1    a  0.1836433
3   1    a -0.8356286
4   2    a  1.5952808
5   2    a  0.3295078
6   2    a -0.8204684
7   3    b  0.4874291
8   3    b  0.7383247
9   3    b  0.5757814
10  4    b -0.3053884
11  4    b  1.5117812
12  4    b  0.3898432
get.means <- function(var, dframe){
  dframe <- dframe[order(dframe$ID),]
  mat    <- aggregate(var~ID, data=dframe, FUN=mean)
  mat 
}
get.means(var=x, dframe=dframe)
Error in eval(expr, envir, enclos) : object 'x' not found

我可以通过使用 get.means(var=dframe$x, dframe=dframe) 让它工作,但这会导致其他问题。 以下是我尝试过的其他一些方法,但没有奏效:

get.means2 <- function(var, dframe){
  dframe <- dframe[order(dframe$ID),]
  mat    <- aggregate(get(var)~ID, data=dframe, FUN=mean)
  mat 
}
get.means2(var=x, dframe=dframe)
Error in get(var) : object 'x' not found
get.means3 <- function(var, dframe){
  dframe <- dframe[order(dframe$ID),]
  mat    <- aggregate(eval(var)~ID, data=dframe, FUN=mean)
  mat 
}
get.means3(var=x, dframe=dframe)
Error in eval(var) : object 'x' not found
get.means4 <- function(var, dframe){
  dframe <- dframe[order(dframe$ID),]
  mat    <- aggregate(dframe[,var]~ID, data=dframe, FUN=mean)
  mat 
}
get.means4(var=x, dframe=dframe)
Error in `[.data.frame`(dframe, , var) : object 'x' not found

x仅在 dframe 范围内定义。你可以试试这个:

get.means <- function(var, dframe){
    aggregate(as.formula(paste(var, '~ ID')), data=dframe, FUN=mean)
}
get.means(var='x', dframe=dframe)

您还可以使用列名调用get.means4

get.means4(var='x', dframe=dframe)

甚至以这种方式get.means3(尽管我不建议这样做):

get.means3(var=dframe$x, dframe=dframe)

在最后一种情况下,您可以安全地删除eval并离开:

aggregate(var~ID, data=dframe, FUN=mean)

您可以考虑使用 data.table 而不是 data.frame 。它允许更小,也许更易于管理的代码。

require(data.table)
DT <- data.table(ID = rep(1:4, each = 3), cond = rep(c("a", "b"), each = 6), x = rnorm(12))
DT
##     ID cond           x
##  1:  1    a -0.97191681
##  2:  1    a  1.28097125
##  3:  1    a -0.47717701
##  4:  2    a -0.29965951
##  5:  2    a  1.06189839
##  6:  2    a  1.09880286
##  7:  3    b -1.46961507
##  8:  3    b  1.12854103
##  9:  3    b -0.09556682
## 10:  4    b  0.45225307
## 11:  4    b -0.64993127
## 12:  4    b -0.59079915
DT[, mean(x), by = ID]
##    ID          V1
## 1:  1 -0.28531921
## 2:  2  0.01713826
## 3:  3  0.23810745
## 4:  4 -0.16118247

最新更新