我从csv文件中读取的数据帧具有这样的列名
abc.def, ewf.asd.fkl, qqit.vsf.addw.coil
我想删除'.' 从所有的名称,并将其转换为
abcdef, eqfasdfkl, qqitvsfaddwcoil.
我尝试使用sub命令, sub(".","",colnames(dataframe))但是此命令取出了每个列名的第一个字母,并且列名更改为
bc.def, wf.asd.fkl, qit.vsf.addw.coil
任何人都知道这样做的另一个命令.我可以逐个更改列名,但是我有很多文件,每个文件中有30个或更多列.
再次,我想删除"." 从所有的名字.我试图这样做,所以我可以使用"sqldf"命令,这些命令不能很好地处理"."
谢谢您的帮助
G. *_*eck 17
1)如果引用名称,sqldf可以处理其中包含点的名称:
library(sqldf)
d0 <- read.csv(text = "A.B,C.D\n1,2")
sqldf('select "A.B", "C.D" from d0')
Run Code Online (Sandbox Code Playgroud)
赠送:
A.B C.D
1 1 2
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但是,在此示例中,它仍然留下一个必须在sqldf中引用的名称,因为名称具有嵌入空格.
3)要简单地删除句点,if DF是数据框:
names(DF) <- gsub(".", "", names(DF), fixed = TRUE)
Run Code Online (Sandbox Code Playgroud)
或者将句点转换为下划线以使其可逆是更好的:
names(DF) <- gsub(".", "_", names(DF), fixed = TRUE)
Run Code Online (Sandbox Code Playgroud)
这最后一行可以像这样:
names(DF) <- chartr(".", "_", names(DF))
Run Code Online (Sandbox Code Playgroud)
要替换名称中的所有点,您需要使用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
Run Code Online (Sandbox Code Playgroud)
更新 dplyr 0.8.0
由于 dplyr 0.8funs()已被软弃用,请使用公式表示法。
一种dplyr使用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 \\
Run Code Online (Sandbox Code Playgroud)
确保使用install.packages().
请记住,您必须.使用\\.in regex对字符进行转义,其功能类似于str_replace_alluse, .是通配符。