首页 > 解决方案 > 反码函数,处理引号

问题描述

我正在寻找一些帮助来定义一个函数来反向编码一个序数变量。我正在使用调查数据,其中理论上相关的变量被编码在不同的方向,即对概念的看法是用几个不同的变量来衡量的,其中一些将较高的值表示为“正”,其他将较低的值表示为“正”。我编写了一个函数,允许我对选定的变量进行反向编码,以便它们被一致地编码:

reverse_code <- function(x, df){
  df[x] <- df[x] * -1 + max(df[x], na.rm = TRUE) + 1
  return(df)
}

# call the function - note that var names need to be quoted, but not the dataframe
data <- reverse_code(c("var1", "var2", "var3", "var4"), data)

但正如您在我上面的代码注释中看到的那样,它对引号很敏感。需要引用变量名,但不需要引用数据框。关于如何使这项工作使其对引号的包含/排除不敏感的任何想法?我考虑在开头包含一个 if/else 语句来测试引号,但我不确定我会如何做到这一点。

我意识到这个函数已经假设数据已经清除了负值,对于我通常使用的数据,几乎完全表示缺失值。


编辑:

根据评论,澄清一下,如果我这样调用函数,我希望它无关紧要:

reverse_code(var1, data)

或像这样:

reverse_code("var1", data)

标签: rnse

解决方案


你可以做这样的事情,使用match.call

foo <- function(x, df) {

  thecall <- match.call()

  if (is.symbol(thecall[["x"]])) return(paste0("NSE: ", as.character(thecall[["x"]])))
    else
  return(paste0("SE: ", x))  
}

foo(x)
#[1] "NSE: x"
foo("x")
#[1] "SE: x"

或者,如果您不需要额外的处理,只需:

foo <- function(x, df) {

  thecall <- match.call()

  x <- as.character(thecall[["x"]])

  x
}

我认为你不应该,但你可以。


推荐阅读