R:仅将一列数据帧(不是数据帧)发送到用户定义的函数

时间:2011-12-15 15:17:08

标签: r

我知道之前曾提出过非常类似的问题,但我仍然没有从那些较旧的帖子中得到我的确切问题的答案。我的函数'test'需要在数据帧的列'col'上执行 only (实际上来自.csv文件的数据)'x',即

test <- function(x$col){...}
:
test(x$col)

我知道这种语法不起作用。所以我需要这样做:

test <- function(x,col){...}
:
test(x$col)

但上面的问题是,由于R函数固有地通过值传递,整个数据帧'x'被传递给函数'test',这是一种非常有效的方式,特别是一个大的'x' !

解决方法是:

test <- function(y){...}
:
y <- x$col
test(y)

但这并不好。我为一个奇怪的现象添加了一个额外的代码行/向量,我没有看到明显的原因!此外,这使代码的可读性变得复杂,因为代码中的其他地方我对该列使用x$col

有没有办法通过使用'x'和'col'的组合(并且没有额外的变量!)作为我的函数'test'的参数来发送列的副本(x$col) ??

或者有人可以建议一个原因是不能只发送一个列作为函数'test'的参数吗?另外,每次使用x$col通常效率低下,因为它可能不会一直存在于内存中吗?

3 个答案:

答案 0 :(得分:4)

这不起作用:

spam <- function(col) {
   return(col*10)
}

dat <- data.frame(bla = 1:10, xi = 1:10)

spam(dat$bla)

我不认为bla完全传递给函数。看着:

> str(dat$bla)
 int [1:10] 1 2 3 4 5 6 7 8 9 10

我怀疑在子设置时会创建一个新对象,并且只传递dat$bla中的值。或者我在这里完全错了?

答案 1 :(得分:2)

这将取决于你如何调用测试,但其中任何一个都可能是答案:

test <- function(x,col){  x[[col]] } # for x being data.frame or list

test <- function(x,col){ x[ , col] } # for x being data.frame or matrix

在向函数传递参数时,应避免使用“$”运算符,因为它不会将“col”的值转换为其他值。它试图以“col”的名称返回一列,这通常不是你将一个参数传递给一个函数时的结果。另一方面,“[”和“[[”函数将评估col并使用您传递的值进行提取。

如果您只想处理一个列,那么这也是可能的:

test <- with(x, function(col) {col} )  
# obviously you could do more with col inside the braces

with函数设置一个环境,其中“col”将被解释为有效的对象名称。

答案 2 :(得分:1)

我不确定,但这是你想要的吗?

#Your Data Frame
x<-data.frame(matrix(rnorm(25),ncol=5))
x

#A Function to text Something, you choose the data and the columm
test.function<- function(data.frame,columm) {
                                            data.frame[,columm]>0
                                            }
#Work either with the number of the columm                                            
test.function(x,1)
#or de "name" of the columm
test.function(x,"X1")