我正在尝试使用固定变量和在函数内创建的一些变量的混合来对函数中的数据框进行子集化(我只知道变量名,但不能事先对它们进行矢量化)。这是一个简化的例子:
a<-c(1,2,3,4)
b<-c(2,2,3,5)
c<-c(1,1,2,2)
D<-data.frame(a,b,c)
subbing<-function(Data,GroupVar,condition){
g=Data$c+3
h=Data$c+1
NewD<-data.frame(a,b,g,h)
subset(NewD,select=c(a,b,GroupVar),GroupVar%in%condition)
}
请记住,在我的应用程序中,我无法在函数外部计算g和h。有时我会根据h的值(如上所述)进行选择,有时我会想要使用g。我也可能想要同时使用两者,但即使只能使用1进行子集也会很棒。
subbing(D,GroupVar=h,condition=5)
返回错误,指出无法找到对象h。我曾尝试使用as.formula和各种各样的东西来修改子集,但我每次都失败了。
除了功能的简易性之外,我还想使用子集。
在我实际工作的函数中,我使用了子集两次。第一次是简单的子集函数。下面刚才有人指出,另一篇博客探讨了如何最好地使用好的旧数据[colnames()==“g”,]。谢谢你的建议,我会去的。
然而还有另一个问题。我还在我的函数中使用子集(或者更确切地说是变体),因为我正在处理几个复杂的设计调查(参见包调查),所以subset.survey.design允许您为子组获得正确的方差估计。如果我使用[]选择我的组,我会得到错误的。对于我的参数,我想这是一个非常重要的问题。
谢谢
答案 0 :(得分:3)
正在发生这种情况,因为函数在开始时尝试定义GroupVar
。 R正在查找对象h
(不在数据框内)。
最好的办法是在subset
函数中引用引号中的列名。但当然,那么你必须回避条件部分:
subbing <- function(Data, GroupVar, condition) {
....
DF <- subset(Data, select=c("a","b", GroupVar))
DF <- DF[DF[,3] %in% condition,]
}
这样可以解决问题,尽管将一个数据帧索引到另一个数据帧中会很烦人。