我需要对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
答案 0 :(得分: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)
答案 1 :(得分: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