4

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

我想创建一个带有一些参数的函数,该函数将用于对 data.frame 进行子集化。我搜索了论坛,发现这些问答很有趣,但无法从讨论中回答我的问题:

我要创建的函数将采用 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")

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

4

1 回答 1

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 控制台之外的任何其他模式。

于 2013-06-10T11:30:04.547 回答