Пользовательские классы для каждого элемента в кадре данных в R - PullRequest
1 голос
/ 18 апреля 2020

Я очень новичок в S3, и мне было интересно, возможно ли это, учитывая следующий фрейм данных:

test <- tibble(
  elements = c("one", "two", "three"),
  S3 = c("foo", "bar", "foo")
)

Я мог бы дать каждому элементу в столбце elements собственный класс из столбца S3:

custom_class <- function(x, customclass) {
  class(x) <- c(class(x), customclass)
  return(x)
}

# test
s <- "string"
custom_class(s, "anything")
test <- tibble(
  elements = c("one", "two", "three"),
  S3 = c("foo", "bar", "foo"),
  testing = custom_class(elements, S3)
)

Но это не работает. Это связано с пробелом в ментальной модели моего понимания S3? Можно ли таким образом применять разные классы к каждому элементу, а если нет, то каким-либо образом создать вывод в виде списка, чтобы каждый элемент в списке представлял собой element с классом S3? Любые советы / советы приветствуются!

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Другой вариант - rowwise, если мы хотим придерживаться dplyr

library(dplyr)
tibble(
  elements = c("one", "two", "three"),
   S3 = c("foo", "bar", "foo")) %>% 
    rowwise %>%
    mutate(test = list(custom_class(elements, S3)))
# A tibble: 3 x 3
# Rowwise: 
#  elements S3    test      
#  <chr>    <chr> <list>    
#1 one      foo   <charactr>
#2 two      bar   <charactr>
#3 three    foo   <charactr>
1 голос
/ 18 апреля 2020

При использовании c во фрейме данных все атрибуты теряются. Мы можем сохранить любые пользовательские атрибуты, создав столбец списка во фрейме данных:

test <- tibble(
  elements = c("one", "two", "three"),
  S3 = c("foo", "bar", "foo"),
  test = map2(elements, S3, ~ custom_class(.x, .y))
)
...