【发布时间】:2017-01-19 01:28:00
【问题描述】:
我正在处理一个纵向数据集,并在长格式 data.table 中对主题进行重复观察。大多数受试者有少数(100)次观察。我可以将这个数据集从长转换为宽,如下所示,但它变得非常宽(我在每个时间点都有很多变量)并且大部分都充满了 NA,因为大多数受试者在 11 到 100 的时间没有变量数据. 有没有更优雅的方式将这些数据重铸为宽格式?我在想其他语言中的参差不齐的数组......
存在一些解决方案here,但对我来说一个大问题是对象大小:具有大量 NA 的宽矩阵占用了大量不必要的空间。
下面是我当前(不希望的稀疏矩阵)解决方案的 MWE。理想情况下,如果某种参差不齐的列表方法可行,则生成的对象将有 3 行和 3 列,其中“年份”和“代码”列是列表或类似的。作为奖励,如果我可以将“代码”变量嵌套在“年份”变量中作为嵌套的不规则数组,那就太好了。
library(data.table)
dat <- data.table(id=c(rep(1,5), rep(2,10), rep(3,85)),
year=sample(2013:2016, 100, replace=TRUE),
code=sample(LETTERS, 100, replace=TRUE))
wideDat <- dcast(dat, id~paste0("code", dat[,seq_len(.N), by=id]$V1),
value.var="code")
【问题讨论】:
-
您能否提供一个看起来像您想要的输出的对象?我猜它不像wideDat
-
@Frank 这实际上是我的问题的一部分:我最近才开始使用 data.table,并且在许多情况下发现灵活定义数据对象的奇妙惊喜。希望有人可以在这里同样启发我。在一个伪对象中:列
id=c(1,2,3);列year是一个长度为 3 的列表,每个项目的条目数与纵向观测值一样多(不存储数百个 NA);列code是一个长度为 3 的列表,其定义类似于year。不一定停留在列表上(并且不确定在 data.table 的上下文中是否可行),这就是我想到的。 -
好的。您可以使用
dat[, lapply(.SD, list), by=id],但这对于分析或打印或我能想到的其他任何事情都不是非常有用的格式。
标签: r data.table dcast