【发布时间】:2017-03-07 17:05:32
【问题描述】:
我是 R 新手。我从数据库中导出数据并尝试重命名列。
现有名称示例(每个水质参数一个站点)在下面的引号中。每个站点有 6 个可能的参数和 40 个站点;我想根据参数和站点重命名列。站点名称为 3-7 个字符,并且始终出现在最后一个小数点之后。我的数据集 (AQexport1) 有 240 列和 47,714 行(行是每小时连续数据的时间戳)。我希望能够使用该数据库中具有相同格式和参数但可能不同站点的其他导出代码。
例如:
- “水.温度.水.温度.BUBU”| “Water.Temp.Temperature.BUBU”
- “Water.Temp.Field.Visits.KNF_DUP”
- “Sp.Cond.TempCorrected_nodrift.LOD_DUP”
- “Sp.Cond.TempCorrected.PFM”
- “Sp.Cond.Field.Visits.CC7”
- “Cond.Conductivity.TM02Dup”
我不知道如何在 if 语句中编写 contains()(我意识到下面的语法是错误的,我只是想说明我在想什么),或者如何从字符串中提取字符具有多个小数点,并且不会从列名的末尾提取相同数量的字符。我也想知道通过 colnames() 的 for 循环是否是最好的解决方案。
for (i in 1:colnames(AQexport1)){
if (colnames(AQexport1[i]) contains "Water.Temp.W" | "Water.Temp.T"){
colnames(AQexport1[i]) <- Temp.insert_site_name_here
}
elseif (colnames(AQexport1[i])) contains "Water.Temp.F") {
colnames(AQexport1[i]) <- FVTemp.insert_site_name_here
}
elseif (colnames(AQexport1[i])) contains "nodrift") {
colnames(AQexport1[i])<-SpCnd.insert_site_name_here
}
elseif (colnames((AQexport1[i])) contains "Sp.Cond.T") {
colnames(AQexport1[i])<-SpC.insert_site_name_here
}
#continue elseif statements
}
【问题讨论】:
-
请考虑参考this discussion 并使您的帖子可复制。我认为您正在寻找
%in%,例如:c("a", "b") %in% c("a", 45)。您的代码似乎在语法上不正确,contains提供的类似对象将引用对象contains,还有其他奇怪的事情,如果AQexport1是一个向量,AQexport1,AQexport1[i]是什么是有意义的,但是我有点想,在您的代码AQexport1的上下文中对应于一些数据? -
在重命名列的情况下,您可以:
names(mtcars)[names(mtcars) %in% c("mpg", "cyl")] <- c("renameThisColumn") -
感谢康拉德提供的链接。我肯定会在以后的帖子中提到这一点。我知道 colnames 生成了一个可以索引的向量,但正如您所指出的,我错误地认为我可以替换该向量中的值来更改我的数据框中的列名。
-
您的重命名解决方案有效。但是,由于要更改 240 个唯一的列名,并且列名可能会根据我从数据库中导出的内容而改变,我希望有一个不需要输入每个名称的解决方案。如果我使用 substring() 函数创建新名称,Ryan 的解决方案应该可以工作。
标签: r if-statement for-loop extract columnname