将我的代码功能化,将外部创建的数据帧调用为函数



我有一个名为"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

最新更新