gpt4 book ai didi

r - 将可变长度数据存储在R data.frame中的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 03:35:04 27 4
gpt4 key购买 nike

我有一些混合类型的数据要存储在某种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

实际值并非可以相互计算,但这就是数据的精髓。我要执行的操作包括根据 bool 函数(例如 nchar(data$phrase) > 10lapply(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)))

但这是最好的方法吗?

最佳答案

对我来说,试图将数据塞入数据帧似乎有些棘手。最好将每一行视为一个单独的对象,然后将数据集视为这些对象的数组。

此函数将您的数据字符串转换为适当的格式。 (这是S3样式代码;您可能更喜欢使用“适当的”面向对象系统之一。)

as.mydata <- function(x)
{
UseMethod("as.mydata")
}

as.mydata.character <- function(x)
{
convert <- function(x)
{
md <- list()
md$phrase = x
spl <- strsplit(x, " ")[[1]]
md$num_words <- length(spl)
md$token_lengths <- nchar(spl)
class(md) <- "mydata"
md
}
lapply(x, convert)
}

现在您的整个数据集看起来像
mydataset <- as.mydata(c("hello world", "greetings", "take me to your leader"))

mydataset
[[1]]
$phrase
[1] "hello world"

$num_words
[1] 2

$token_lengths
[1] 5 5

attr(,"class")
[1] "mydata"

[[2]]
$phrase
[1] "greetings"

$num_words
[1] 1

$token_lengths
[1] 9

attr(,"class")
[1] "mydata"

[[3]]
$phrase
[1] "take me to your leader"

$num_words
[1] 5

$token_lengths
[1] 4 2 2 4 6

attr(,"class")
[1] "mydata"

您可以定义打印方法以使其看起来更漂亮。
print.mydata <- function(x)
{
cat(x$phrase, "consists of", x$num_words, "words, with", paste(x$token_lengths, collapse=", "), "letters.")
}
mydataset
[[1]]
hello world consists of 2 words, with 5, 5 letters.
[[2]]
greetings consists of 1 words, with 9 letters.
[[3]]
take me to your leader consists of 5 words, with 4, 2, 2, 4, 6 letters.

对于这种格式的数据,您要执行的示例操作相当简单。
sapply(mydataset, function(x) nchar(x$phrase) > 10)
[1] TRUE FALSE TRUE

关于r - 将可变长度数据存储在R data.frame中的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321786/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com