【问题标题】:Subsetting based on multiple function arguments基于多个函数参数的子集
【发布时间】:2013-06-06 01:04:02
【问题描述】:

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

我想创建一个带有一些参数的函数,这些参数将用于对 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")

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

【问题讨论】:

  • 您应该阅读this post 以了解更多关于在函数中使用subset 的问题。
  • 我注意到您的代码中没有使用很多空格,例如function(df,col,etc) -> function(df, col, etc)col==val -> col == val。添加空格使您的代码更易于阅读,不那么令人生畏。
  • 乔纳森,你也应该阅读this meta entry

标签: r function subset


【解决方案1】:

你会想做一些类似的事情:

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

【讨论】:

  • 太棒了——这完全有道理。感谢 Paul 这么快的回复。
  • 如果您想使用[.data.frame 模仿subset,您可能需要注意NA。 subset 删除那些逻辑表达式计算结果为 NA 的行索引。
  • 并且您应该添加drop = FALSE,以防用户传入 1 col df。
  • @hadley 我也添加了改进。
猜你喜欢
  • 1970-01-01
  • 2021-10-11
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多