Debugging 在R函数中粘贴变量名
在我的帮助下 虽然我雄心勃勃,但我现在想把它变成一种功能。另外,我有很多查找表,我需要快速查找我的数据,这样一个函数就很方便了 但首先是一些样本数据,从数据框架开始Debugging 在R函数中粘贴变量名,debugging,r,function,Debugging,R,Function,在我的帮助下 虽然我雄心勃勃,但我现在想把它变成一种功能。另外,我有很多查找表,我需要快速查找我的数据,这样一个函数就很方便了 但首先是一些样本数据,从数据框架开始 df <- data.frame(id = c(1:6), profession = c(1, 5, 4, NA, 0, 5)) df # id profession # 1 1 # 2 5 # 3 4 # 4
df <- data.frame(id = c(1:6),
profession = c(1, 5, 4, NA, 0, 5))
df
# id profession
# 1 1
# 2 5
# 3 4
# 4 NA
# 5 0
# 6 5
但显然这是行不通的
ADDlookup(df, profession)
我得到了错误的混乱
Error in paste(orginalDF, "$", orginalVAR, sep = "") :
object 'profession' not found
现在,这就是我被卡住的地方
谁能告诉我需要阅读哪一页手册,或者是一个友好的提示来解决这个问题
感谢您的阅读。当然有更复杂的方法让它按照您最初设想的方式工作,但简单地重新组织该函数的工作方式会简单得多:
ADDLookup <- function(originalDF,var,varLookup){
match.idx <- match(originalDF[,var], varLookup)
originalDF[,var] <- ifelse(is.na(match.idx),
originalDF[,var], names(varLookup)[match.idx])
originalDF
}
ADDLookup(df,"profession",profession.lookuptable)
id profession
1 1 Optometrists
2 2 Nurses
3 3 Financial analysts
4 4 <NA>
5 5 0
6 6 Nurses
ADDLookup这是因为您正在将profession
传递到ADDLookup
函数中,但它还不存在
按照编写函数的方式,必须区分使用包含变量名称的字符向量和变量本身
例如,您的前几行paste(originalDF,$',originalVAR,sep='')
似乎期望originalDF
和originalVAR
是字符串,而DF.VAR
是字符串'DF$professional'
。但是,当您进行match
时,似乎希望DF.VAR
成为变量DF$profession
这就是我建议你如何绕过它:
-作为对象传入originalDF
,作为df
-将originalVAR
作为字符串传入,作为的“profession”
(它是一个列名,因此是一个字符串)
然后,通过以下方式从数据框中检索originalVar
中包含的列:
DF.VAR <- originalDF[,originalVAR] # e.g. df[,'profession']
这将检索名为'profession.lookuptable'
的对象。它遵循与您直接键入profession.lookuptable
相同的规则,因此您必须确保函数可以“看到”该对象(在您的情况下,您应该可以)
接下来,您似乎希望返回originalDF
数据帧,其中originalVAR
列已被查找值替换
我只需修改originalDF[,originalVAR]
列,将其替换为查找值:
originalDF[,originalVAR] <-
ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
现在大家一起:
ADDlookup <- function(orginalDF, orginalVAR) {
# retrieve the originalVAR column of originalDF
DF.VAR <- originalDF[,originalVAR]
# find the variable called {originalVAR}.lookuptable
lookup.table <- get(paste(originalVAR, "lookuptable",sep='.'))
# look up the values
match.idx <- match(DF.VAR, lookup.table)
# replace the originalVAR column with the looked-up values
originalDF[,originalVAR] <-
ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
# return the modified data frame
return(originalDF)
}
然后您可以避免整个get(xxxx)
行(以及与之相关的所有作用域问题)
然后您可以通过以下方式调用该函数:
ADDlookup( df, 'profession', profession.lookup )
我将查找表定义为因子
df[,"profession"] <- profession.lookuptable[df[,"profession"]]
df[,“profession”]+1好的,所以没有那么复杂,但我试图避免使用get
。是的,我也不喜欢使用get
;我编辑了我的帖子,提到:。@mathematic.coffee哇哦,这真是信息量太大了。谢谢你花时间把这一切解释得如此透彻。可能是我,但当我运行您的代码时,当运行ADDlookup(df,“profession”)中的最后一个函数时,我确实会收到一条错误消息:未找到对象“originalDF”
。明天早上我再看一看,我现在已经很晚了。再次感谢你抽出时间,我肯定会重读你的文章(好几次)。谢谢谢谢你抽出时间来收拾我的烂摊子。我不确定我是否完全理解这一切,但工作已经完成了。谢谢函数中的所有df
不都应该替换为originalDF
?
originalDF[,originalVAR] <-
ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
return(originalDF)
ADDlookup <- function(orginalDF, orginalVAR) {
# retrieve the originalVAR column of originalDF
DF.VAR <- originalDF[,originalVAR]
# find the variable called {originalVAR}.lookuptable
lookup.table <- get(paste(originalVAR, "lookuptable",sep='.'))
# look up the values
match.idx <- match(DF.VAR, lookup.table)
# replace the originalVAR column with the looked-up values
originalDF[,originalVAR] <-
ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
# return the modified data frame
return(originalDF)
}
> ADDlookup(df,'profession')
id profession
1 1 Optometrists
2 2 Nurses
3 3 Financial analysts
4 4 <NA>
5 5 0
6 6 Nurses
ADDlookup <- function( originalDF, originalVAR, lookup.table )
ADDlookup( df, 'profession', profession.lookup )
df[,"profession"] <- profession.lookuptable[df[,"profession"]]