如何在数据框中删除列名中的“.”?

11

我从csv文件中读取的数据框的列名如下

abc.def, ewf.asd.fkl, qqit.vsf.addw.coil

我想把所有名称中的“.”去掉并转换为

abcdef, eqfasdfkl, qqitvsfaddwcoil。

我尝试使用子命令sub(".","",colnames(dataframe)),但该命令会将每个列名的第一个字母删除,使列名更改为

bc.def, wf.asd.fkl, qit.vsf.addw.coil

有人知道另一个命令来实现这个目的吗?我可以逐个更改列名,但我有很多文件,每个文件有30个或更多列。

再次说明,我要删除所有列名中的“.”。我正在尝试做到这一点,以便使用“sqldf”命令,因为该命令不处理“。”。

感谢您的帮助

4个回答

21

1) 如果你将名称用引号括起来,sqldf可以处理名称中带有点的情况:

library(sqldf)
d0 <- read.csv(text = "A.B,C.D\n1,2")
sqldf('select "A.B", "C.D" from d0')

提供:

  A.B C.D
1   1   2

2) 使用read.tableread.csv读取数据时,使用check.names=FALSE参数。

比较:

Lines <- "A B,C D
1,2
3,4"
read.csv(text = Lines)
##   A.B C.D
## 1   1   2
## 2   3   4
read.csv(text = Lines, check.names = FALSE)
##   A B C D
## 1   1   2
## 2   3   4

然而,在这个例子中,仍然存在一个名称,需要在sqldf中用引号括起来,因为名称中嵌入了空格。

3) 如果DF是数据框,则可以简单地删除句点:

names(DF) <- gsub(".", "", names(DF), fixed = TRUE)

或者将句点转换为下划线可能会更好,这样就可以进行反向操作:


or it might be nicer to convert the periods to underscores so that it is reversible:
names(DF) <- gsub(".", "_", names(DF), fixed = TRUE)

这一行也可以用如下方式来完成:

names(DF) <- chartr(".", "_", names(DF))

7

更新 dplyr 0.8.0

从 dplyr 0.8 开始,funs() 被软弃用,请使用公式符号。

使用 stringr 实现的 dplyr 方式来实现此操作。

library(dplyr)
library(stringr)

data <- data.frame(abc.def = 1, ewf.asd.fkl = 2, qqit.vsf.addw.coil = 3)
renamed_data <- data %>%
  rename_all(~str_replace_all(.,"\\.","_")) # note we have to escape the '.' character with \\

请确保你使用 install.packages() 命令安装依赖包。

记得在正则表达式中,. 字符需要使用 \\. 进行转义,例如在 str_replace_all 函数中使用时,. 表示一个通配符。


1
我认为如果在顶部包含当前版本而不是在底部进行编辑,那么这将是一个更好的答案。 (如果您想保留旧版本,则将其放在底部更合适。)此外,在R中说是通配符是不正确的-在正则表达式中,是通配符。另一个很好的选择是使用fixed(“。”)而不是“\\。”。这些数据太小了,无关紧要,但是在大型数据上,fixed()会快得多。 - Gregor Thomas

6
为了替换名称中的所有点,您需要使用gsub而不是sub,后者只会替换第一次出现的点。
这应该可以解决问题。
test <- data.frame(abc.def = NA, ewf.asd.fkl = NA, qqit.vsf.addw.coil = NA)
names(test) <- gsub( ".",  "", names(test), fixed = TRUE)
test
  abcdef ewfasdfkl qqitvsfaddwcoil
1     NA        NA              NA

subgsub是一个很好的观点,但由于OP还需要fixed = TRUE,因此最好解释一下。 - Gregor Thomas

0

你也可以尝试:

names(df) = gsub(pattern = ".", replacement = "", x = names(df))

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