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

时间:2018-02-28 14:46:24

标签: r string dataframe

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

示例代码为:

ids = with(df,ave(rep(1,nrow(df)),subcolumn1,subcolumn2,subcolumn3,FUN=seq_along))

我想以下列方式运行此代码(下面的代码无法按预期工作):

subColumnsString = c("subcolumn1","subcolumn2","subcolumn3")
ids = with(df,ave(rep(1,nrow(df)),subColumnsString ,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_wrong中,情况并非如此。

2 个答案:

答案 0 :(得分:2)

我认为这可以实现您的要求。在这里,我使用R附带的mtcars数据集:

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

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

使用子列索引data.frame,这些子列返回一个自然与ave一起使用的列表

编辑

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

您可以省略with,只需调用普通的'ol ave,就像G. Grothendieck所说的那样,您也应该使用他们的答案,因为它更为通用。

答案 1 :(得分:1)

这定义了一个参数为:

的函数
  • data,输入数据框
  • bydata
  • 中列名的字符向量
  • fun,一个在ave
  • 中使用的函数

代码 -

Ave <- function(data, by, fun = seq_along) {
   do.call(function(...) ave(rep(1, nrow(data)), ..., FUN = fun), data[by])
}

# test 
Ave(CO2, c("Plant", "Treatment"), seq_along)

,并提供:

 [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