如何在R中创建,构建,维护和更新数据码本?

Fre*_*red 23 metadata r data-management

为了复制,我喜欢为每个数据帧保留一个包含元数据的码本.数据码本是:

书面或计算机化列表,提供将包含在数据库中的变量的清晰而全面的描述. Marczyk等(2010)

我想记录变量的以下属性:

  • 名称
  • 描述(标签,格式,比例等)
  • 来源(例如世界银行)
  • 源媒体(访问的网址和日期,CD和ISBN,或其他)
  • 磁盘上源数据的文件名(合并代码簿时有帮助)
  • 笔记

例如,这是我实现的用于记录数据框mydata1中具有8个变量的变量:

code.book.mydata1 <- data.frame(variable.name=c(names(mydata1)),
     label=c("Label 1",
              "State name",
              "Personal identifier",
              "Income per capita, thousand of US$, constant year 2000 prices",
              "Unique id",
              "Calendar year",
              "blah",
              "bah"),
      source=rep("unknown",length(mydata1)),
      source_media=rep("unknown",length(mydata1)),
      filename = rep("unknown",length(mydata1)),
      notes = rep("unknown",length(mydata1))
)
Run Code Online (Sandbox Code Playgroud)

我为我读过的每个数据集写了一个不同的代码簿.当我合并数据帧时,我还将合并其相关代码簿的相关方面,以记录最终数据库.我这样做主要是复制粘贴上面的代码并更改参数.

dar*_*zig 7

您可以使用该attr函数向任何R对象添加任何特殊属性.例如:

x <- cars
attr(x,"source") <- "Ezekiel, M. (1930) _Methods of Correlation Analysis_.  Wiley."
Run Code Online (Sandbox Code Playgroud)

并查看对象结构中的给定属性:

> str(x)
'data.frame':   50 obs. of  2 variables:
 $ speed: num  4 4 7 7 8 9 10 10 10 11 ...
 $ dist : num  2 10 4 22 16 10 18 26 34 17 ...
 - attr(*, "source")= chr "Ezekiel, M. (1930) _Methods of Correlation Analysis_.  Wiley."
Run Code Online (Sandbox Code Playgroud)

并且还可以使用相同的attr函数加载指定的属性:

> attr(x, "source")
[1] "Ezekiel, M. (1930) _Methods of Correlation Analysis_.  Wiley."
Run Code Online (Sandbox Code Playgroud)

如果只向数据框添加新案例,则给定属性不会受到影响(请参阅:str(rbind(x,x))更改结构时会更新给定属性(请参阅:) str(cbind(x,x)).


更新:基于评论

如果要列出所有非标准属性,请检查以下内容:

setdiff(names(attributes(x)),c("names","row.names","class"))
Run Code Online (Sandbox Code Playgroud)

这将列出所有非标准属性(标准是:名称,行名,数据框中的类).

基于此,您可以编写一个简短的函数来列出所有非标准属性以及值.以下确实有效,但不是很整齐......你可以改进它并组成一个函数:)

首先,定义uniqe(=非标准)属性:

uniqueattrs <- setdiff(names(attributes(x)),c("names","row.names","class"))
Run Code Online (Sandbox Code Playgroud)

并制作一个包含名称和值的矩阵:

attribs <- matrix(0,0,2)
Run Code Online (Sandbox Code Playgroud)

循环遍历非标准属性并在矩阵中保存名称和值:

for (i in 1:length(uniqueattrs)) {
    attribs <- rbind(attribs, c(uniqueattrs[i], attr(x,uniqueattrs[i])))
}
Run Code Online (Sandbox Code Playgroud)

将矩阵转换为数据框并命名列:

attribs <- as.data.frame(attribs)
names(attribs) <- c('name', 'value')
Run Code Online (Sandbox Code Playgroud)

并以任何格式保存,例如:

write.csv(attribs, 'foo.csv')
Run Code Online (Sandbox Code Playgroud)

关于变量标签的问题,请检查read.spsspackage foreign中的函数,因为它完全符合您的需要:将值标签保存在attrs部分.主要思想是attr可以是数据框或其他对象,因此您不需要为每个变量创建唯一的"attr",而只需要创建一个(例如命名为"varable标签")并将所有信息保存在那里.您可以这样调用:attr(x, "variable.labels")['foo']其中'foo'代表所需的变量名称.但请查看上面引用的函数以及导入的数据框的属性以获取更多详细信息.

我希望这些可以帮助你以比我上面尝试的更简洁的方式编写所需的功能!:)


csg*_*pie 5

更高级的版本是使用S4类.例如,在生物传导器中,ExpressionSet用于存储具有其相关实验元数据的微阵列数据.

第4.4节中描述的MIAME对象看起来非常类似于你所追求的:

experimentData <- new("MIAME", name = "Pierre Fermat",
          lab = "Francis Galton Lab", contact = "pfermat@lab.not.exist",
          title = "Smoking-Cancer Experiment", abstract = "An example ExpressionSet",
          url = "www.lab.not.exist", other = list(notes = "Created from text files"))
Run Code Online (Sandbox Code Playgroud)


Rei*_*son 5

comment()功能在这里可能很有用。它可以设置和查询对象上的注释属性,但具有其他正常属性不被打印的优点。

dat <- data.frame(A = 1:5, B = 1:5, C = 1:5)
comment(dat$A) <- "Label 1"
comment(dat$B) <- "Label 2"
comment(dat$C) <- "Label 3"
comment(dat) <- "data source is, sampled on 1-Jan-2011"
Run Code Online (Sandbox Code Playgroud)

这使:

> dat
  A B C
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
> dat$A
[1] 1 2 3 4 5
> comment(dat$A)
[1] "Label 1"
> comment(dat)
[1] "data source is, sampled on 1-Jan-2011"
Run Code Online (Sandbox Code Playgroud)

合并示例:

> dat2 <- data.frame(D = 1:5)
> comment(dat2$D) <- "Label 4"
> dat3 <- cbind(dat, dat2)
> comment(dat3$D)
[1] "Label 4"
Run Code Online (Sandbox Code Playgroud)

但这失去了对dat()以下内容的评论:

> comment(dat3)
NULL
Run Code Online (Sandbox Code Playgroud)

所以这些类型的操作需要明确处理。要真正做您想做的事,您可能需要编写您使用的特殊版本的函数,以在提取/合并操作期间维护注释/元数据。或者,您可能希望研究生成您自己的对象类 - 例如作为包含数据框和其他包含元数据的组件的列表。然后为您想要保留元数据的函数编写方法。

沿着这些路线的一个例子是 zoo 包,它为时间序列生成一个列表对象,其中包含保存排序和时间/日期信息等的额外组件,但从子集等的角度来看,它仍然像普通对象一样工作,因为作者提供了[等函数的方法


hpl*_*ger 5

截至 2020 年,已有直接专用于代码本的 R 软件包可以满足您的需求。

\n\n\n