这感觉就像一个非常初学的问题。
在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]来计算它是没有用的。
有没有办法在函数中使用$动态调用?
谢谢。
答案 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