0

我需要对 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
4

2 回答 2

2

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)
于 2013-10-31T00:30:23.533 回答
1

您可以考虑使用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
于 2013-10-31T01:58:42.797 回答