基于多个函数参数的子集

时间:2013-06-10 11:25:31

标签: r function subset

我是函数写作的新手,所以希望下面的内容有所帮助。

我想创建一个带有一些参数的函数,这些参数将用于对data.frame进行子集化。我在论坛上搜索过,发现这些Q&有趣,但未能从讨论中回答我的问题:

我想要创建的函数将采用df,列名和值以匹配列名的行。这是我的尝试,我认为这是错误的:

x <- data.frame("col1"=c("email","search","direct"),
            "col2"=c("direct","email","direct"),
            "col3"=c(10,15,27))

fun <- function(df,col,val) {
  result <- subset(df, col==val)
  return(result)
}

我想传入df,x。列名,让我们说“col2”。一个值,比方说“电子邮件”。我尝试这样做会返回一个0长度的df。

fun(x,"col2","email")

显然,我做错了什么......有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

你会想要做的事情如下:

df[df[[col_name]] == value,]

然后该功能变为:

fun <- function(df, col_name, value) {
  df[df[[col_name]] == value,]
}
fun(x, 'col2', 'email')
    col1  col2 col3
2 search email   15

如果您想在逻辑矢量中考虑NA值:

fun <- function(df, col_name, value) {
  logical_vector = df[[col_name]] == value
  logical_vector[is.na(logical_vector)] = FALSE
  df[logical_vector, drop = FALSE]
}

为什么您的示例不起作用是因为subset没有查看col的值。相反,它会查找名为col的列。我怀疑val参数也未正确解析。这是不在非交互模式下使用subset的原因之一,即在交互式R控制台之外的任何其他模式。