我有一个名为“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个观察值。)
我读到有一种叫做全球/本地环境的东西,但我并不是很清楚。
如何解决此问题?非常感谢你提前!!
答案 0 :(得分:3)
当您尝试使用subset(Region_Data, Region == "Input_Region" )
对数据进行子集化时,"Input_Region"
被解释为字符串文字,而不是被计算为它所代表的值。这意味着,除非对象Input_Region
中的列Region_Data
包含值"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
但只有第三个才有效,如果是矢量:
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