如何在不在R中输入字符串的情况下更新列名

如何在不在R中输入字符串的情况下更新列名,r,string,dataframe,R,String,Dataframe,我正在与一家公司合作,将人体测量参数转换为Z分数 就问题而言,调用who2007函数需要我们给出数据帧的名称,然后只给出变量(列)的名称,就像在ggplot函数中一样。问题是,如果列名是Age,则输入argument=Age与输入argument='Age'不同。前者返回一个double,但后者返回一个列表。我假设这是做df$Age和df['Age']的区别 如果我有一个只包含列名的向量,并且每次都需要使用不同的列对相同的代码进行迭代,如果我依次输入该字符向量的各个条目,则函数会抛出一个错误,因

我正在与一家公司合作,将人体测量参数转换为Z分数

就问题而言,调用
who2007
函数需要我们给出数据帧的名称,然后只给出变量(列)的名称,就像在ggplot函数中一样。问题是,如果列名是
Age
,则输入
argument=Age
与输入
argument='Age'
不同。前者返回一个
double
,但后者返回一个
列表
。我假设这是做
df$Age
df['Age']
的区别

如果我有一个只包含列名的向量,并且每次都需要使用不同的列对相同的代码进行迭代,如果我依次输入该字符向量的各个条目,则函数会抛出一个错误,因为它在内部遇到的是一个列表而不是双精度列表。我该如何避免这种情况?我能想到的一种方法是使用列编号或使用任何grep方法来识别列编号,但是还有其他更好的方法吗

附录

这是函数源代码(我认为其中的一部分可以解释问题)


who2007我们可以测试输入数据框是否有必需的列,然后去掉“deparse get”步骤,例如:

who2007 <- function(FileLab = "Temp", FilePath = "C:\\Documents and Settings",
                    mydf,
                    oedema = rep("n",dim(mydf)[1]),sw=rep(1,dim(mydf)[1])) {

  if(!all(c("sex", "age", "weight", "height") %in% colnames(mydf))) stop("mydf, must have 'sex', 'age', 'weight', 'height' columns")

  sex.x <- mydf$sex
  age.x <- mydf$age
  # ...
  # some code
  # ...

  #return
  list(sex.x, age.x)
}

who2007如果要修改每一列,可以使用mutate\u all@RussHyde没有,只是它的一小部分。请提供函数示例
who2007
,它不必是完整的函数,足够简单,我们可以看到输入参数和数据子集部分。我猜您可以将colnames作为字符向量传递,并在函数中使用
lappy
循环遍历列?@zx8754我添加了该函数。我没有收到你评论的第二部分。我想你可以重写函数来接受字符串以满足你的需要,而不是使用一系列
get
&
deparse(substitute())
谢谢。看到它的存在似乎是多余的,
deparse get
到底做了什么?@SatwikPasani Try:
deparse(substitute(sex))
并且没有参数将列的名称(在迭代中更新)放入您提到的函数中。我错过什么了吗?还是RAlso的初学者,你能检查一下问题中的附录2吗?@SatwikPasani不确定我是否理解,你想在不改变函数的情况下解决问题吗?
who2007 <- function(FileLab = "Temp", FilePath = "C:\\Documents and Settings",
                    mydf,
                    oedema = rep("n",dim(mydf)[1]),sw=rep(1,dim(mydf)[1])) {

  if(!all(c("sex", "age", "weight", "height") %in% colnames(mydf))) stop("mydf, must have 'sex', 'age', 'weight', 'height' columns")

  sex.x <- mydf$sex
  age.x <- mydf$age
  # ...
  # some code
  # ...

  #return
  list(sex.x, age.x)
}
#example dataframe   
x <- head(mtcars)

# this errors as required columns are missing
who2007(mydf = x)
# Error in who2007(mydf = x) : 
#   mydf, must have 'sex', 'age', 'weight', 'height' columns

# now update columns with required column names, and it works fine:
colnames(x)[1:4] <- c("sex", "age", "weight", "height")
who2007(mydf = x)
# [[1]]
# [1] 21.0 21.0 22.8 21.4 18.7 18.1
# 
# [[2]]
# [1] 6 6 4 6 8 6