列继承 R 中数据框自定义 class 的函数
Function for columns to inherit custom class of data frame in R
我有一个数据框列表
dd <- list()
dd$dat <- list(
one = data.frame(a = c(1), b = c(2)),
two = data.frame(c = c(3), d = c(4)),
three = data.frame(e = c(5), f = c(6))
)
并编写了一个函数来将自定义 class 附加到每个数据帧:
# append classes
append_classes <- function(x, nm) {
class(x) <-
case_when(
nm == "one" ~ c(class(x), "foo"),
nm == "two" ~ c(class(x), "bar"),
TRUE ~ c(class(x), "custom")
)
return(x)
}
dd$dat <- imap(dd$dat, append_classes)
class(dd$dat[[1]])
有效!
[1] "data.frame" "foo"
但现在我想使用 class 继承让每个数据框中的列继承 foo
、bar
和 custom
class分别是 es - 我该怎么做?
期望的输出
class(dd$dat$one$a)
[1] "numeric" "foo"
class(dd$dat$two$d)
[1] "numeric" "bar"
我刚开始使用 S3,所以非常感谢您的帮助!
我们可以递归使用imap
或者在
里面使用map
library(purrr)
dd$dat <- imap(dd$dat, ~ {nm1 <- .y
map_dfr(append_classes(.x, nm1), ~ append_classes(.x, nm1))
})
class(dd$dat$one$a)
#[1] "numeric" "foo"
class(dd$dat$two$d)
#[1] "numeric" "bar"
或者这可以通过 base R
使用 Map/lapply
来完成
dd$dat <- Map(function(x, y) {
tmp <- append_classes(x, y)
tmp[] <- lapply(tmp, append_classes, nm = y)
tmp} , dd$dat, names(dd$dat))
class(dd$dat$one$a)
#[1] "numeric" "foo"
我有一个数据框列表
dd <- list()
dd$dat <- list(
one = data.frame(a = c(1), b = c(2)),
two = data.frame(c = c(3), d = c(4)),
three = data.frame(e = c(5), f = c(6))
)
并编写了一个函数来将自定义 class 附加到每个数据帧:
# append classes
append_classes <- function(x, nm) {
class(x) <-
case_when(
nm == "one" ~ c(class(x), "foo"),
nm == "two" ~ c(class(x), "bar"),
TRUE ~ c(class(x), "custom")
)
return(x)
}
dd$dat <- imap(dd$dat, append_classes)
class(dd$dat[[1]])
有效!
[1] "data.frame" "foo"
但现在我想使用 class 继承让每个数据框中的列继承 foo
、bar
和 custom
class分别是 es - 我该怎么做?
期望的输出
class(dd$dat$one$a)
[1] "numeric" "foo"
class(dd$dat$two$d)
[1] "numeric" "bar"
我刚开始使用 S3,所以非常感谢您的帮助!
我们可以递归使用imap
或者在
map
library(purrr)
dd$dat <- imap(dd$dat, ~ {nm1 <- .y
map_dfr(append_classes(.x, nm1), ~ append_classes(.x, nm1))
})
class(dd$dat$one$a)
#[1] "numeric" "foo"
class(dd$dat$two$d)
#[1] "numeric" "bar"
或者这可以通过 base R
使用 Map/lapply
dd$dat <- Map(function(x, y) {
tmp <- append_classes(x, y)
tmp[] <- lapply(tmp, append_classes, nm = y)
tmp} , dd$dat, names(dd$dat))
class(dd$dat$one$a)
#[1] "numeric" "foo"