4

我处理大多数标题名称都是非常长的字符串的数据。这些是神秘的,但包含不能忘记的重要细节。由于各种显示原因以及编程原因,长列名称难以使用。为了解决这个问题,我通常将原始列名保留为 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 并且仍然查找标签以获取原始名称。然而,这仍然不能令人满意...... myDF 现在由“labelled”类组成,并且包含字符向量,尽管我的数据本质上是数字的。转换为数字甚至子集 myDF 将导致标签被丢弃。有人有更好的建议吗?特别是我需要对数据进行子集化,并且我还发现按数字索引很笨拙且容易出错。

由于相对于 RAM 的大量数据,我无法同时保留数字和“标记”数据帧的副本。我还尝试使用 hash 包创建散列对象:

library(hash)
myHash <- hash(colnames(myDF), label(myDF))

或通过列表:

nameList <- list()
for(name in colnames(myDF)) {
  nameList[[name]] <- label(myDF)[name]
}

但是......我也发现这些不令人满意,主要是因为它们在各种操作后可能与 myDF 不同步,并且无法从同一个对象访问它们。也许我只是需要更加勤奋。

最后,我认为也许一个解决方案是一个自定义类,它包含一个 data.frame 和一些其他数据结构,以了解非常无意义的简洁名称、冗长和非唯一的昵称以及真正的变量名称。但这需要重载所有索引运算符,并且可能超出我的技能范围。

那么还有其他有目的的解决方案吗?任何帮助表示赞赏。

4

1 回答 1

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
于 2015-03-04T02:11:10.020 回答