使用字符串标识R中的列名序列

使用字符串标识R中的列名序列,r,string,dataframe,R,String,Dataframe,我目前正在尝试使用预定义字符串来标识R中的多个列名。 更明确地说,我使用ave函数为数据帧的子组创建标识变量。我希望标识变量是灵活的,这样我就可以把它作为一个通用字符串来传递 示例代码为: ids = with(df,ave(rep(1,nrow(df)),subcolumn1,subcolumn2,subcolumn3,FUN=seq_along)) 我希望以以下方式运行此代码(以下代码无法按预期工作): 我尝试了一些eval,但仍然不起作用: subColumnsString = c("s

我目前正在尝试使用预定义字符串来标识R中的多个列名。 更明确地说,我使用
ave
函数为数据帧的子组创建标识变量。我希望标识变量是灵活的,这样我就可以把它作为一个通用字符串来传递

示例代码为:

ids = with(df,ave(rep(1,nrow(df)),subcolumn1,subcolumn2,subcolumn3,FUN=seq_along))
我希望以以下方式运行此代码(以下代码无法按预期工作):

我尝试了一些eval,但仍然不起作用:

subColumnsString = c("subcolumn1","subcolumn2","subcolumn3")
ids = with(df,ave(rep(1,nrow(df)),eval(parse(text=subColumnsString)),FUN=seq_along))
有什么想法吗? 谢谢

编辑:我想要的工作代码示例:

df = mtcars
id_names = c("vs","am")
idDF_correct = transform(df,idItem = as.numeric(interaction(vs,am)))
idDF_wrong = cbind(df,ave(rep(1,nrow(df)),df[id_names],FUN=seq_along))

请注意,在idDF_correct中,唯一组合如何正确映射到idItem的唯一值。在idDF_错误中,情况并非如此。

这定义了一个函数,其参数为:

  • 数据
    ,输入数据帧
  • by
    ,数据中列名的字符向量
  • fun
    ,在
    ave
代码--


这定义了一个函数,其参数为:

  • 数据
    ,输入数据帧
  • by
    ,数据中列名的字符向量
  • fun
    ,在
    ave
代码--


我认为这达到了你的要求。在这里,我使用了随R附带的
mtcars
数据集:

subColumnsString <- c("cyl","gear")

ids = with(mtcars, ave(rep(1,nrow(mtcars)), mtcars[subColumnsString], FUN=seq_along))

你可以用省略
,只需像G.Grothendieck所说的那样简单地叫'ol
ave
,你也应该使用他们的答案,因为它更一般。

我认为这达到了你的要求。在这里,我使用了随R附带的
mtcars
数据集:

subColumnsString <- c("cyl","gear")

ids = with(mtcars, ave(rep(1,nrow(mtcars)), mtcars[subColumnsString], FUN=seq_along))

你可以用
省略
,只需调用普通的'ol
ave
,正如G.Grothendieck所说,你也应该使用他们的答案,因为答案更一般。

由于没有真正使用with,所以可以省略它。出于某种原因,这并没有像预期的那样创建标识号(数字会在不同的子组中重复)。我的标识变量是字符串,但这应该不是问题,对吗?使用交互时,它工作得很好:idDF=transform(df,id=as.numeric(交互(subCol1,subCol2,subCol3)))一个预期输出的示例可能会有所帮助。使用mwe编辑问题。with没有真正使用,因此可以省略。由于某些原因,这并没有按预期创建标识号(该编号在不同的子组中重复).My identification variables是字符串,但这应该不是问题,对吗?使用交互时,它工作得很好:idDF=transform(df,id=as.numeric(交互(subCol1,subCol2,subCol3)))预期输出的示例会有所帮助。使用mwe编辑问题。
 [1] 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3
[39] 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6
[77] 7 1 2 3 4 5 6 7
subColumnsString <- c("cyl","gear")

ids = with(mtcars, ave(rep(1,nrow(mtcars)), mtcars[subColumnsString], FUN=seq_along))
ids = ave(rep(1,nrow(mtcars)), mtcars[subColumnsString], FUN=seq_along)