这是一个例子rle
。该rle
函数创建 a list
,但它没有 class list
,因此像这样的方法as.data.frame
不会“开箱即用”。因此,我将最后一行更改为添加"list"
为类之一。
x <- c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3)
rle2 <- function (x)
{
if (!is.vector(x) && !is.list(x))
stop("'x' must be an atomic vector")
n <- length(x)
if (n == 0L)
return(structure(list(lengths = integer(), values = x),
class = "rle"))
y <- x[-1L] != x[-n]
i <- c(which(y | is.na(y)), n)
## THE FOLLOWING IS FROM THE BASE RLE. NOTICE ONLY ONE CLASS...
# structure(list(lengths = diff(c(0L, i)), values = x[i]),
# class = "rle")
structure(list(lengths = diff(c(0L, i)), values = x[i]),
class = c("rle", "list"))
}
如您所见,我只是更改了class
. 其余功能相同。
rle(x)
# Run Length Encoding
# lengths: int [1:3] 4 3 7
# values : num [1:3] 1 2 3
data.frame(rle(x))
# Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) :
# cannot coerce class ""rle"" to a data.frame
rle2(x)
# Run Length Encoding
# lengths: int [1:3] 4 3 7
# values : num [1:3] 1 2 3
data.frame(rle2(x))
# lengths values
# 1 4 1
# 2 3 2
# 3 7 3
当然,如果我们知道这一点,我们也可以明确指定我们的方法,如果我们知道存在一个方法:
as.data.frame.list(rle(x))
# lengths values
# 1 4 1
# 2 3 2
# 3 7 3