我使用的数据是大多数标题名称非常长的字符串。这些都是神秘的,但包含了不容忽视的重要细节。由于各种显示原因以及程序化原因,长列名称难以使用。为了解决这个问题,我通常将原始列名保留为Hmisc标签&使用无法提供的名称(如V1,V2,V3等)或使用长名称的某些截断(但仍然很长且通常不唯一)版本重命名列。
library(Hmisc)
myDF <- read.csv("someFile.csv")
myLabels <- colnames(myDF)
label(myDF, self=FALSE) <- myLabels
colnames(myDF) <- paste0("V", 1:ncol(myDF))
我现在可以使用短名称V&amp;仍然查找标签以获取原始名称。然而,这仍然不太令人满意...... myDF现在由class&#34;标记为&#34;并包含字符向量,虽然我的数据本质上是数字的。转换为数字甚至子集myDF将导致标签被删除。有没有人有更好的建议?特别是我需要子集数据,&amp;我还发现数字索引是笨拙的。容易出错。
由于相对于RAM的大数据,我无法保留数字和数据的副本。 &#34;标记&#34; data.frames。我也尝试使用哈希包创建哈希对象:
library(hash)
myHash <- hash(colnames(myDF), label(myDF))
或通过列表:
nameList <- list()
for(name in colnames(myDF)) {
nameList[[name]] <- label(myDF)[name]
}
但是......我也发现这些不满意主要是因为它们可能会在各种操作之后与myDF失去同步。它们不能从同一个对象访问。也许我只需要更加勤奋。
最后,我想也许一个解决方案可能是一个包含data.frame&amp;的自定义类。一些其他数据结构,以了解非常无意义的简洁名称,详细和&amp;非独特的昵称,&amp;真正的变量名称。但这需要重载所有索引操作符&amp;很可能是明智之举。
那么任何其他目的解决方案?任何帮助赞赏。
答案 0 :(得分:1)
您可以在此处采用关系数据库方法。创建一个单独的data.frame,表示缩写和长名称之间的关联。
library(Hmisc)
myDF <- read.csv("someFile.csv")
LongNames <- colnames(myDF)
colnames(myDF) <- paste0("V", 1:ncol(myDF))
ShortNames <- colnames(myDF)
NameTable <- cbind(LongNames, ShortNames)
即使您的数据稍后被操作,变量的短名称和长名称之间的关联也应保持不变。当然,每次创建一个需要长名称的新变量时,您都需要在NameTable中添加一个新行,但无论如何您都需要将该长名称放在某处。
要使用短名称轻松检索长名称,您可以为此目的定义一个函数。
L = function(x){NameTable[which(ShortNames == x),1]}
L(V3) #gives long name of V3