#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)
, thenmy_function(datadump2222)
. Пожалуйста, прочтите главу «Функции» из R for Data Science для хорошего введения.