R Сохранение вывода функции на объект при использовании функции назначения - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я пытаюсь улучшить мой код, переписав некоторые части с помощью функций. Одна из функций, которые я использую:

datasetperuniversity<-function(university,year){assign(paste("data",university,sep=""),subset(get(paste("originaldata",year,sep="")),get(paste("allcollaboration",university,sep=""))==1))}

Выполнение функции datasetperuniversity («Гарвард», «2000») приведет к тому, что функция будет выглядеть примерно так:

dataHarvard=subset(originaldata2000,allcollaborationHarvard==1)

Функция работает почти идеально, за исключением того, что она не сохраняет результаты в dataHarvard. Я читал, что это нормально в функциях, и использование << - вместо = может решить эту проблему, однако, поскольку я использую функцию assign, это на самом деле невозможно, так как = является просто результатом присвоения функция. </p>

Вот некоторые данные:

sales = c(2, 3, 5,6) 
numberofemployees = c(1, 9, 20,12) 
allcollaborationHarvard = c(0, 1, 0,1) 
originaldata = data.frame(sales, numberofemployees, allcollaborationHarvard)

1 Ответ

0 голосов
/ 03 мая 2018

Как правило, лучше не вставлять данные / переменную в имя объекта. Поэтому вместо использования assign до dataHarvard создайте список data с элементом под названием «Гарвард»:

# enumerate unis, attaching names for lapply to use
unis = setNames(, "Harvard")

# make a table for each subset with lapply
data = lapply(unis, function(x) 
  originaldata[originaldata[[ paste0("allcollaboration", x) ]] == 1, ]
)

, что дает

> data
$Harvard
  sales numberofemployees allcollaborationHarvard
2     3                 9                       1
4     6                12                       1

Как видно здесь, вы можете использовать DF[["column name"]] для доступа к столбцу вместо get, как в OP. Также см. Примечание в ?subset:

Внимание

Это удобная функция, предназначенная для интерактивного использования. Для программирования лучше использовать стандартные функции подмножеств, такие как [, и, в частности, нестандартная оценка подмножества аргументов может иметь непредвиденные последствия.

Как правило, лучше не включать данные в имена столбцов, если это возможно. Если столбцы allcollaboration* являются взаимоисключающими, их можно свернуть в одну категориальную переменную со значениями, такими как «Гарвард», «Йель» и т. Д. В качестве альтернативы может иметь смысл поместить данные в длинную форму .

Для получения дополнительных инструкций по организации данных, я рекомендую аккуратную бумагу Хэдли Уикхема .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...