功能化我的代码 - 将外部创建的数据框调用到函数中

时间:2015-05-20 16:25:37

标签: r

我有一个名为“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个观察值。)

我读到有一种叫做全球/本地环境的东西,但我并不是很清楚。

如何解决此问题?非常感谢你提前!!

1 个答案:

答案 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