重复用户定义的函数以对数据帧进行子集化

时间:2013-12-26 18:53:23

标签: r

这是我的问题:我使用" fread"以大约100,000行的方式阅读大约300万行和100列。功能。对于每一块数据,我正在做一些组织数据集,提取应用某些条件的一些行(例如物种名称=狗,朱利安日期范围是x到y,人口范围小于z等),然后写出一个csv文件包含每个块的选择列(比如10个而不是全部100个),以便稍后我可以访问该文件。我将具有针对每个物种的特定功能。我尝试用以下方式编写一个函数,以便我可以在循环中使用它,我用它来读取块中的300万条记录。

假设DF1是具有100列的第1 100,000个行块的数据帧。

dog.1 <- function(){
#Creating vectors for each of the 10 columns
stdate <- DF1$V8
spcdog <- DF1$23
.
.
.
NDF1 <- data.frame(stdate,spcdog, ........)
}

当我调用此函数时,我期待向量(stdate,spcdog .....)和data.frame&#34; NDF1&#34;要被创造。我知道向量和数据框是创建的,但显然我在函数关闭后会丢失函数内创建的所有变量。我应该如何解决这个问题?我只想保留数据框。

我提前感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

罗兰说,你应该使用返回值。

因此,尝试消除“NDF1&lt; - ”,然后你应该看到至少一些输出(我没有信息说它是否正确)

答案 1 :(得分:0)

您需要从该函数中捕获值:

dog.1 <- function(){
  #Creating vectors for each of the 10 columns
  stdate <- DF1$V8
  spcdog <- DF1$V23   # oops ... cannot have variables named with just numerals

  data.frame(stdate,spcdog)
}

NDF1 <- dog.1()

我不会这样做,但我认为正在发生的事情是你的努力可能没有错误,但结果没有分配给一个名字。 NDF1对象正在创建,但一旦函数调用完成就会丢失,因为它只存在于函数环境中。与其他评论者不同,我认为如果您的版本被调用,您应该看到结果。但也许缺少测试用例会阻止我在理解中看到错误。这不是第一次。

DF <- data.frame(V8 = 1:10, V23=letters[1:10], V24 = letters[11:20])
  dog.1 <- function(){
  #Creating vectors for each of the 10 columns
  stdate <- DF1$V8
  spcdog <- DF1$V23   # oops ... cannot have variables named with just numerals

  data.frame(stdate,spcdog)
}

dog.1 <- function(){
  stdate <- DF$V8
  spcdog <- DF$V23   

  data.frame(stdate,spcdog)
}

NDF1 <- dog.1()
dog.1()
   stdate spcdog
1       1      a
2       2      b
3       3      c
4       4      d
5       5      e
6       6      f
7       7      g
8       8      h
9       9      i
10     10      j
> str(NDF1)
'data.frame':   10 obs. of  2 variables:
 $ stdate: int  1 2 3 4 5 6 7 8 9 10
 $ spcdog: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10

我将<-作为最终函数调用的版本错了。我认为<-会返回赋值的RHS值,但显然不会。尽管如此,在赋值的RHS中使用它将成功的意义上,该函数将“起作用”:

> dog.1 <- function(){
+   stdate <- DF$V8
+   spcdog <- DF$V23   
+   XYZ <- data.frame(stdate,spcdog)
+ }
> NDF1 <- dog.1()
> str(NDF1)   # success
'data.frame':   10 obs. of  2 variables:
 $ stdate: int  1 2 3 4 5 6 7 8 9 10
 $ spcdog: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
> dog.1()
> # no screen output
> # But if you used .Last.value you would see the data.frame
> # So we know that the data.frame is being returned but it
> # is being returned invisibly.
> .Last.value
   stdate spcdog
1       1      a
2       2      b
3       3      c
4       4      d
5       5      e
6       6      f
7       7      g
8       8      h
9       9      i
10     10      j