无法为R用户定义的函数传递变量名

时间:2017-12-18 20:16:20

标签: r function

我试图创建一个函数,根据一个变量中提供的编码和另一个变量中的跳过模式将变量重新编码为新变量。

我创造了一个简单的例子:

data <- data.frame(A=1:4, B=c(1,1,1,2))

我的功能如下:

recode_4scale <- function (var, name, skip, df){
  df$name <- df$var #generate new variable
  df[which(df$skip==2),"name"] <- 5 #replace with 5 if skip pattern
  df[is.na(df$var),"name"] <- 6 #replace with 6 if missing
  df$name <- df$name == 3 | df$name==4 #code as true if 3 or 4
  df$name <- as.factor(df$name)
  return (df)
}
data1<-recode_4scale(A, new, B, data)

我得到:警告信息: 在is.na(df $ var)中:is.na()应用于类型为&#39; NULL&#39;

的非(列表或向量)

我期望通过逐行运行得到的结果:

data$new <- data$A
data[which(data$B==2),"new"] <- 5
data[is.na(data$A),"new"] <- 6
data$new <- data$new == 3 | data$new == 4
data$new <- as.factor(data$new)
data$new
[1] FALSE FALSE TRUE  FALSE
Levels: FALSE TRUE

我相信我在传递名字方面遇到了麻烦,因为即使是最简单的功能我也无法获得任何东西。

知道这里出了什么问题吗? (我也知道这不是编写这个东西的最好方法,新员工修复旧代码,一旦我运行就会改进它)

1 个答案:

答案 0 :(得分:0)

object$variable不对variable进行替换。 相反,它假设您的对象中已经存在一些已经被称为variable的东西(不是variable的值,而是实际的字符串“变量”)。 但是,以下内容可行:

data <- data.frame(A=1:4, B=c(1,1,1,2))
variable <- "A"
data[[variable]]  # Same as df[["A"]] or df$A
# [1] 1 2 3 4

所以,你的功能应该是:

recode_4scale <- function (var, name, skip, df){
  df[[name]] <- df[[var]] #generate new variable
  df[which(df[[skip]]==2), name] <- 5 #replace with 5 if skip pattern
  df[is.na(df[[var]]), name] <- 6 #replace with 6 if missing
  df[[name]] <- df[[name]] == 3 | df[[name]] == 4 #code as true if 3 or 4
  df[[name]] <- as.factor(df[[name]])
  return (df)
}
data1 <- recode_4scale("A", "new", "B", data)
data1
#   A B   new
# 1 1 1 FALSE
# 2 2 1 FALSE
# 3 3 1  TRUE
# 4 4 2 FALSE