当读取列名以数字开头的.csv文件时,R有问题;它通过放置" X"来改变这些名称。作为第一个角色。
我正在尝试编写一个简单解决这个问题的函数(尽管:这是最简单的方法吗?)
作为示例文件,我只是在iris中创建了两个新的(非感性)列:
iris$X12.0 <- iris$Sepal.Length
iris$X18.0 <- iris$Petal.Length
remv.X <- function(x){
if(substr(colnames(x), 1, 1) == "X"){
colnames(x) <- substr(colnames(x), 2, 100)
}
else{
colnames(x) <- substr(colnames(x), 1, 100)
}
}
remv.X(iris)
打印时,我收到警告,没有任何变化。 我做错了什么?
答案 0 :(得分:3)
<强> check.names = FALSE 强>
使用read.table / read.csv参数check.names = FALSE
关闭列名称修改。
例如,
read.csv(text = "1x,2x\n10,20", check.names = FALSE)
,并提供:
1x 2x
1 10 20
使用子
删除X.如果由于某种原因你在某些列名称的开头有一个不需要的X字符,可以像这样删除它们。这仅删除列名开头的X,下一个字符是数字。如果下一个字符不是数字或者没有下一个字符,则列名保持不变。
names(iris) <- sub("^X(\\d.*)", "\\1", names(iris))
或作为一种功能:
rmX <- function(data) setNames(data, sub("^X(\\d.*)", "\\1", names(data)))
# test
iris <- rmX(iris)
有问题的代码存在问题
问题中的代码存在两个问题。
在if (condition) ...
中,条件是向量,但必须是a
标量。
永远不会返回数据框。
这里修好了。我们还考虑了if
的两条腿的LHS。
remv.X2 <- function(x) {
for (i in seq_along(x)) {
colnames(x)[i] <- if (substr(colnames(x)[i], 1, 1) == "X") {
substr(colnames(x)[i], 2, 100)
} else {
substr(colnames(x)[i], 1, 100)
}
}
x
}
iris <- remv.X2(iris)
或者甚至可能:
remv.X3 <- function(x) {
setNames(x, substr(colnames(x), (substr(colnames(x), 1, 1) == "X") + 1, 100))
}
iris <- remv.X3(iris)