我有一些混合类型的数据,我想存储在某种R数据结构中.每个数据点都有一组固定属性,可以是一维数字,因子或字符,也可以是一组可变长度数据.例如:
id phrase num_tokens token_lengths
1 "hello world" 2 5 5
2 "greetings" 1 9
3 "take me to your leader" 4 4 2 2 4 6
Run Code Online (Sandbox Code Playgroud)
实际值并非都可以相互计算,但这就是数据的味道.我想要做的操作包括基于布尔函数对数据进行子集化(例如,nchar(data$phrase) > 10或者类似的东西lapply(data$token_lengths, length) > 2).我也想通过索引对变量长度部分中的值进行索引和平均.这不起作用,但是喜欢:mean(data$token_lengths[1], na.rm=TRUE))
我发现通过使它成为一个数组,我可以将"token_lengths"塞进一个data.frame:
d <- data.frame(id=c(1,2,3), ..., token_lengths=as.array(list(c(5,5), 9, c(4,2,2,4,6)))
Run Code Online (Sandbox Code Playgroud)
但这是最好的方法吗?
由于 R 数据框架结构松散地基于 SQL 表,因此数据框架的每个元素都是原子数据类型以外的任何元素的情况并不常见。但是,正如您所展示的,这是可以完成的,并且此链接的帖子描述了大规模实现的此类应用程序。
另一种方法是将数据存储为字符串并使用函数来检索它,或者创建一个附加数据的单独函数并使用数据框中存储的索引提取数据。
> ## alternative 1
> tokens <- function(x,i=TRUE) Map(as.numeric,strsplit(x[i],","))
> d <- data.frame(id=c(1,2,3), token_lengths=c("5,5", "9", "4,2,2,4,6"))
>
> tokens(d$token_lengths)
[[1]]
[1] 5 5
[[2]]
[1] 9
[[3]]
[1] 4 2 2 4 6
> tokens(d$token_lengths,2:3)
[[1]]
[1] 9
[[2]]
[1] 4 2 2 4 6
>
> ## alternative 2
> retrieve <- local({
+ token_lengths <- list(c(5,5), 9, c(4,2,2,4,6))
+ function(i) token_lengths[i]
+ })
>
> d <- data.frame(id=c(1,2,3), token_lengths=1:3)
> retrieve(d$token_lengths[2:3])
[[1]]
[1] 9
[[2]]
[1] 4 2 2 4 6
Run Code Online (Sandbox Code Playgroud)