为R用户定义的函数传递变量名称的麻烦[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

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

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()应用于'NULL'类型的非(列表或向量)

我希望通过逐行运行得到什么:

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

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

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

r function
1个回答
0
投票

object$variable不对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
© www.soinside.com 2019 - 2024. All rights reserved.