我从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"这些命令不能很好地处理"。"
感谢您的帮助
答案 0 :(得分:16)
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.table
或read.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)
或者将句点转换为下划线可能更好,这样它是可逆的:
names(DF) <- gsub(".", "_", names(DF), fixed = TRUE)
最后一行可以这样做:
names(DF) <- chartr(".", "_", names(DF))
答案 1 :(得分: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
答案 2 :(得分:1)
更新dplyr 0.8.0
从dplyr 0.8 funs()
开始已弃用,请使用公式符号。
使用dplyr
的{{1}}方法。
stringr
确保使用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
是通配符。