在函数内调用$

时间:2015-08-10 13:54:04

标签: r

这感觉就像一个非常初学的问题。

在R中,有没有办法根据传递给函数的参数使用$运算符?

我正在尝试编写一个简单的函数:

subs <- function(x, y){
  x<- subset(x, x$UR!=0)
  x<- subset(x, !is.na(x$y))
  x
}

返回:

Warning message:
In is.na(x$y) : is.na() applied to non-(list or vector) of type 'NULL'

因为我有超过30列,所以用[y]来计算它是没有用的。

有没有办法在函数中使用$动态调用?

谢谢。

3 个答案:

答案 0 :(得分:4)

扩展@ akrun的评论:

subs <- function(x, y){
  x <- x[x[,"UR"]!=0,]
  x <- x[!is.na(x[,y]),]
  x
}

你对函数的调用看起来像subs(dataframe, "variable.name"),后者用引号。

前两行中每一行括号内的表达式返回一个TRUE / FALSE值的向量,用于标识满足指定条件的x中的行(例如,对于x中的行i,列的值) &#34; UR&#34;不等于0)。在表达式之后使用该向量将其放在括号中与逗号相邻的括号中,使用该向量仅从x中选择嵌套表达式的结果为TRUE的那些行(因此是尾随逗号)。

N.B。这个答案假定UR是该数据帧中变量的名称。

答案 1 :(得分:1)

一般来说,当有*+%%$[等特殊运算符时,使用的第一步或访问有关该运算符的更多信息是将其放在引号中。您想要$的帮助页面吗?然后做?"$"。现在,如果你想以非标准方式使用该函数(如你所愿,这很好),那么你可以使用do.call,并且该函数的第一个参数是引号中的函数:do.call(what="$", ...) do.call的下一个参数涉及要传递给what的参数列表。这比您提出的要广泛得多,但我希望将来对您有用。

其次,您不需要使用$。您只需为data.frame指定列名称即可。而不是data$col,请尝试data[,"col"]。对于data.frame,它们是相同的。如果data是一个列表,您可以data[["col"]]

以下是专门针对您的问题的示例:

# Data set to work with for examples
df <- data.frame(ran=rnorm(10), num=1:10)

# Function giving example of what you wanted
get.col <- function(dat, col){
    do.call("$", list(dat, col))
}
get.col(df, "ran")

# A function providing an alternative approach
get.col2 <- function(dat, col){
    dat[,col]
}
get.col2(df, "ran")

答案 2 :(得分:0)

您可以按如下方式使用列名:

拳头我加载示例数据,

data(mtcars) head(mtcars

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

重写函数:

subs <- function(x){
  x<- subset(x, x[,"mpg"]!=21.0)
  x<- subset(x,!is.na(x[,"mpg"]))
  x
}


subs(mtcars)
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2