Использование объекта S3 для анализа других данных.фреймы — вопрос уровня новичка

#r #dataframe #r-s3

#r #фрейм данных #r-s3

Вопрос:

Это была попытка понять ООП — сейчас я изучаю ее. Я очень новичок в R, и я бы подумал об удалении вопроса, поскольку он плохо сформулирован. Я бы не стал использовать его для обучения или руководства

Часть 1 — Я хочу создать класс в S3 с использованием datadump1111 данных. Я хочу вызвать объект S3 a50survey , затем я хочу выполнить вывод. Кажется, это работает, но я не уверен, что я создал правильный класс S3 или функция работает так, как обычно.

 a50DATA <- datadump1111
inputdata <- sapply(a50DATA, function(x) t(sapply(x, table)))
a50survey <- sapply(inputdata, function(x) colSums(prop.table(x)))
print(a50survey)
class(a50survey)
a50survey$drugs
 
 > a50survey$drugs
       Not Tried once Occasional    Regular 
      0.72       0.12       0.14       0.02 
 

Часть 2 То, к чему я действительно стремлюсь, — это ввести новые данные datadump2222 вместо оригинала datadump1111 , который я пытался сделать с помощью

 a50DATA <- datadump2222
a50survey$drugs
 

Что я получаю

 > a50survey$drugs
       Not Tried once Occasional    Regular 
      0.72       0.12       0.14       0.02 
 

Что я должен получить, так это

 $drugs
       Not Tried once Occasional    Regular 
      0.52       0.14       0.34       0.00 
 

… и когда я запускал a50survey , я надеялся, что добавление нового a50DATA будет подхвачено объектом S3 a50survey и даст мне другой набор выходных данных, правильный для нового набора данных, т.Е. datadump2222 . Но он возвращает выходные данные из datadump1111

Просьба о помощи Можете ли вы просто направить меня к решению, поскольку я хочу понять и воспроизвести это? Спасибо

Вывод из datadump1111 здесь

 > dim(datadump1111)
[1] 50  4
> str(datadump1111)
'data.frame':   50 obs. of  4 variables:
 $ alcohol: Factor w/ 5 levels "Not","Once or Twice a week",..: 3 2 3 2 4 4 3 4 2 4 ...
 $ drugs  : Factor w/ 4 levels "Not","Tried once",..: 1 3 1 1 3 1 2 3 1 1 ...
 $ smoke  : Factor w/ 3 levels "Not","Occasional",..: 1 3 1 1 1 3 3 3 1 2 ...
 $ sport  : Factor w/ 2 levels "Not regular",..: 1 1 1 1 2 2 2 2 1 2 ...
 

Комментарии:

1. Я не думаю, что в вашем коде есть что-то настраиваемое в отношении классов / методов S3 — и в этом нет необходимости.

2. Смысл S3 заключается в вызове различных реализаций функций на входах разных классов. Так что, например, sort() будет правильно сортировать вектор, независимо от того, даете ли вы ему numeric вектор, character вектор, Date вектор и т. Д. В вашем вопросе нет ничего, что выглядело бы так, будто вы хотите делать разные вещи в зависимости от class типа. Похоже, вы хотите сделать то же самое с разными наборами данных, что было бы просто обычной старой функцией.

3. Если вы хотите узнать о классах S3, я бы предложил главу Advanced R, посвященную S3 . Но с чего я действительно думаю, что вам следует начать, так это с главы о функциях из R for Data Science. из

4. @GregorThomas Значит, я должен снова запустить функцию с новым набором данных и кодом в обычном режиме? Что делать, если нужно проверить множество наборов данных? Извините, что действительно запутался в этом. я подумал, точно так же, как print() у меня мог бы быть код выполнения

5. Вы должны написать пользовательскую функцию. Вы этого не сделали, вы объединяете другие функции, но вы не заключили их в свою собственную функцию, чтобы упростить повторное выполнение того же кода на другом входе. Вы пишете свою собственную функцию с function() помощью команды, например, my_function <- function(...){...} . Затем вы можете вызвать свою функцию для разных наборов данных, например, my_function(datadump1111) , then my_function(datadump2222) . Пожалуйста, прочтите главу «Функции» из R for Data Science для хорошего введения.