R 清除多个数据帧的列名

R 清除多个数据帧的列名,r,stringr,R,Stringr,我希望清理多个数据帧的列名,而不是目前一次只清理一个。请参阅下面的代码 #Create data frame with basic data patientID <- c(1, 2, 3, 4) AdmDate <- as.POSIXct(c('2010-10-11','2008-3-25','2016-4-23','2011-6-12')) diabetes <- c("Type1", "Type2", "Type1", "Type2") `p-status` <- c

我希望清理多个数据帧的列名,而不是目前一次只清理一个。请参阅下面的代码

#Create data frame with basic data
patientID <- c(1, 2, 3, 4)
AdmDate <- as.POSIXct(c('2010-10-11','2008-3-25','2016-4-23','2011-6-12'))
diabetes <- c("Type1", "Type2", "Type1", "Type2")
`p-status` <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(`patient ID`, `Adm Date`, diabetes, `p-status`)
patientdata

#Find and replace spaces in column names 
names(patientdata) <- str_replace_all(names(patientdata)," *",'')

#Find and replace hyphen in column name
names(patientdata) <- str_replace_all(names(patientdata),"-",'')

names(patientdata)
#使用基本数据创建数据框

patientID以下是一个循序渐进的过程示例:

#Create data frame with basic data
`patient ID` <- c(1, 2, 3, 4)
`Adm Date` <- as.POSIXct(c('2010-10-11','2008-3-25','2016-4-23','2011-6-12'))
diabetes <- c("Type1", "Type2", "Type1", "Type2")
`p-status` <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(`patient ID`, `Adm Date`, diabetes, `p-status`, check.names=FALSE)

#Create copies
patientdata2 <- patientdata3 <- patientdata4 <- patientdata

#Make list with all data frames
lst <- mget(ls(pattern="^patientdata"))

#Create Single Function to house all operations

nameChange <- function(df) {
  names(df) <- str_replace_all(names(df)," *",'')
  names(df) <- str_replace_all(names(df),"-",'')
  return(df)
}

#Iterate over all data frames
library(stringr)
lapply(lst, nameChange)
# $patientdata
#   patientID    AdmDate diabetes   pstatus
# 1         1 2010-10-11    Type1      Poor
# 2         2 2008-03-25    Type2  Improved
# 3         3 2016-04-23    Type1 Excellent
# 4         4 2011-06-12    Type2      Poor
# 
# $patientdata2
#   patientID    AdmDate diabetes   pstatus
# 1         1 2010-10-11    Type1      Poor
# 2         2 2008-03-25    Type2  Improved
# 3         3 2016-04-23    Type1 Excellent
# 4         4 2011-06-12    Type2      Poor
# 
# $patientdata3
#   patientID    AdmDate diabetes   pstatus
# 1         1 2010-10-11    Type1      Poor
# 2         2 2008-03-25    Type2  Improved
# 3         3 2016-04-23    Type1 Excellent
# 4         4 2011-06-12    Type2      Poor
#使用基本数据创建数据框

`患者ID`使用
数据中的
集合名
。表格
非常方便

此外,您的正则表达式似乎非常简单,可以将它们组合成一个正则表达式,如
(*|-)

例如:

df1 <- data.frame(a1=c(1,2,3),b2 = c(4,5,6), c3 = c(7,8,9))
df2 <- copy(df1)
df3 <- copy(df1)

library(data.table)
for (df_name in c("df1","df2","df3")){
    setnames(get(df_name), gsub("a|b|c","whatever",colnames(get(df_name))))
}

df1我们可以在将数据集放入
列表后使用
mgsub
from
qdap

library(qdap)
lst <- mget(ls(pattern="^patientdata"))
lst1 <- lapply(lst, function(x) setNames(x, mgsub(c(" ", "-"), c("", ""), names(x))))

示例中的列名不匹配此函数
nameChange
将返回新的data.frame,而@akrun和me提供的解决方案仅编辑现有data.frame的names属性。这可能会使这个答案在大数据框的大列表上变得昂贵。@C8H10N4O2 akrun的两个答案都返回数据框,因此这个答案可以推广到一次调用就将函数应用于多个数据框的概念<代码>数据。表
快速代码很有帮助,但不能教会OP如何根据多个数据帧功能应用程序进行思考。这两个答案都提供了值。在这两个点上,我忘记了setNames(而不是data.table::setNames)返回对象…感谢所有的想法。我对函数式编程没有太多经验,所以这种方法真的很有帮助。我认为能够把操作放在函数中,并用lapply调用它,真的可以简化事情。关于使用mutate_each或mutate_if作为应用正则表达式的方法,您有什么想法?今天早些时候,我使用它将POSIXct类型转换为最新类型,不确定它是否可以用于这种情况。有趣的是,我从中学习了一个新函数,+1。。我唯一的评论是OP并没有要求提供data.frames列表,只是为了清理data.frames。所以我认为在适当的地方编辑它们更有意义。如果要使用
lappy
,一个选项是使用
ls(pattern=…)
返回data.frame名称列表,而不是data.frames本身。@C8H10N4O2我理解,但如果OP希望随后做更多更改,最好将它们放在
列表中。
library(qdap)
lst <- mget(ls(pattern="^patientdata"))
lst1 <- lapply(lst, function(x) setNames(x, mgsub(c(" ", "-"), c("", ""), names(x))))
lst1 <- lapply(lst, function(x) setNames(x, gsub("[- ]+", "", names(x))))
names(lst1[[1]])
#[1] "patientID" "AdmDate"   "diabetes"  "pstatus"