如何在R的数据框中将列名中的多个模式替换为相应的多个模式?

4

我有一个数据框 DataSample,如下所示:

   Area Category.x TopSales Category.y BottomSales
1  East    Seafood 83220.19  Beverages     2135.17
2 North  Beverages 84324.99 Condiments     2658.95
3 South  Beverages 79202.89    Seafood      400.00
4  West  Beverages 70448.24 Condiments     1563.60

我希望将Category.x替换为Category_Top,将Category.y替换为Category_Bottom,因此我尝试了以下步骤:

ColNameOld<-names(DataSample)

ColNameNew_1<-sub('.x','_Top',ColNameOld)

ColNameNew_2<-sub('.y','_Bottom',ColNameNew_1)

names(DataSample)<-ColNameNew_2

因此,我得到了所需的结果,如下所示。

   Area Category_Top TopSales Category_Bottom BottomSales
1  East    Seafood   83220.19    Beverages      2135.17
2 North  Beverages   84324.99    Condiments     2658.95
3 South  Beverages   79202.89    Seafood        400.00
4  West  Beverages   70448.24    Condiments     1563.60

但我的问题是,我如何在一步中做到这一点,在其中传递要替换的字符串模式和相应的匹配模式,分别使用sub()gsub()进行替换?

我的模式总是“.x”和“.y”,将被“_Top”和“_Bottom”替换。


数据样本:

structure(list(Area = c("East", "North", "South", "West"), Category.x = c("Seafood", 
"Beverages", "Beverages", "Beverages"), TopSales = c(83220.19, 
84324.99, 79202.89, 70448.24), Category.y = c("Beverages", "Condiments", 
"Seafood", "Condiments"), BottomSales = c(2135.17, 2658.95, 400, 
1563.6)), .Names = c("Area", "Category.x", "TopSales", "Category.y", 
"BottomSales"), row.names = c(NA, -4L), class = "data.frame")
1个回答

6
您可以使用

标签

library(gsubfn)
colnames(DataSample) <- gsubfn("(\\.(x|y))$", list(`.x`="_Top", 
                   `.y`= "_Bottom"), colnames(DataSample))
colnames(DataSample)
#[1] "Area"            "Category_Top"    "TopSales"        "Category_Bottom"
#[5] "BottomSales"    

另一个选择是 mgsub
library(qdap)
mgsub(c('\\.x$', '\\.y$'), c('_Top', '_Bottom'), 
                      colnames(DataSample), fixed=FALSE)
#[1] "Area"            "Category_Top"    "TopSales"        "Category_Bottom"
#[5] "BottomSales" 

更新

如果存在一个“数据框”列表

 lst <- list(DataSample, DataSample)
 lapply(lst, function(x) {colnames(x) <- gsubfn("(\\.(x|y))$",
       list(`.x`="_Top", `.y`= "_Bottom"),  colnames(x))
  x })

为什么我执行这个代码时会出现Error: '\.' is an unrecognized escape in character string starting ""\."的错误?代码如下:paste0('colnames(',AllDataTables[i],')<-','gsubfn("\\.x|\\.y", list(.x="_Top",.y= "_Bottom"), colnames(',AllDataTables[i], '))') - sunitprasad1
@sunitprasad1 你不能直接赋值 paste0('colnames(', ...)。此外,你的代码中 [i] 等内容很混乱。可能你正在引用循环中的某些东西。 - akrun
是的,一组具有 .x 和 .y 的数据框需要用 Top 和 Bottom 进行替换,我正在尝试将它们放入循环中。 - sunitprasad1
1
@sunitprasad1 更新了帖子,包括当您有一个数据框列表的情况。 - akrun
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/83183/discussion-between-sunitprasad1-and-akrun。 - sunitprasad1
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接