我有一个名为"Region_Data"的数据帧,我通过对它执行一些函数来创建它。
我想取这个名为"Region_Data"的数据帧,并将其用作输入,我想使用我创建的以下函数对其进行子集。该函数应该生成子集数据帧:
Region_Analysis_Function <- function(Input_Region){
Subset_Region_Data = subset(Region_Data, Region == "Input_Region" )
Subset_Region_Data
}
但是,当我创建这个函数并使用
执行它时:Region_Analysis_Fuction("North West")
当我执行这段代码时,我得到0个观察值(尽管我知道数据帧中有xx个观察值)
我读到有一种叫做全局/局部环境的东西,但我不是很清楚。
如何解决这个问题?提前谢谢你!!
当您尝试使用subset(Region_Data, Region == "Input_Region" )
来子集您的数据时,"Input_Region"
被解释为字符串文字,而不是被评估为它所代表的值。这意味着除非对象Region_Data
中的列Input_Region
包含一些值为"Input_Region"
的行,否则函数将返回一个零行子集。删除引号将解决这个问题,并将==
更改为%in%
将使您的函数更加一般化。考虑以下数据集
mydf <- data.frame(
x = 1:5,
y = rnorm(5),
z = letters[1:5])
##
R> mydf
x y z
1 1 -0.4015449 a
2 2 0.4875468 b
3 3 0.9375762 c
4 4 -0.7464501 d
5 5 0.8802209 e
和以下3个函数
qfoo <- function(Z) {
subset(mydf, z == "Z")
}
foo <- function(Z) {
subset(mydf, z == Z)
}
##
bar <- function(Z) {
subset(mydf, z %in% Z)
}
其中qfoo
代表您问题中使用的方法,foo
实现了我注意到的第一个更改,bar
实现了这两个更改。
当输入值为标量时,后两个函数将起作用,
R> qfoo("c")
[1] x y z
<0 rows> (or 0-length row.names)
##
R> foo("c")
x y z
3 3 0.9375762 c
##
R> bar("c")
x y z
3 3 0.9375762 c
,但如果是vector,则只有第三个可用:
R> foo(c("a","c"))
x y z
1 1 -0.4015449 a
Warning messages:
1: In is.na(e1) | is.na(e2) :
longer object length is not a multiple of shorter object length
2: In `==.default`(z, Z) :
longer object length is not a multiple of shorter object length
##
R> bar(c("a","c"))
x y z
1 1 -0.4015449 a
3 3 0.9375762 c