Вы можете добавить любой специальный атрибут к любому объекту R с помощью функции attr
. E.g.:
x <- cars
attr(x,"source") <- "Ezekiel, M. (1930) _Methods of Correlation Analysis_. Wiley."
И увидеть данный атрибут в структуре объекта:
> str(x)
'data.frame': 50 obs. of 2 variables:
$ speed: num 4 4 7 7 8 9 10 10 10 11 ...
$ dist : num 2 10 4 22 16 10 18 26 34 17 ...
- attr(*, "source")= chr "Ezekiel, M. (1930) _Methods of Correlation Analysis_. Wiley."
И может также загрузить указанный атрибут с той же attr
функцией:
> attr(x, "source")
[1] "Ezekiel, M. (1930) _Methods of Correlation Analysis_. Wiley."
Если вы добавляете только новые наблюдения в свой фрейм данных, данный атрибут не будет затронут (см .: str(rbind(x,x))
, а изменение структуры приведет к уменьшению данных атрибутов (см: str(cbind(x,x))
).
ОБНОВЛЕНИЕ: на основе комментариев
Если вы хотите перечислить все нестандартные атрибуты, отметьте следующее:
setdiff(names(attributes(x)),c("names","row.names","class"))
В этом списке будут перечислены все нестандартные атрибуты (стандартные: имена, имена строк, классы во фреймах данных).
Исходя из этого, вы можете написать короткую функцию для перечисления всех нестандартных атрибутов, а также значений. Следующее работает, хотя и не аккуратно ... Вы можете улучшить его и создать функцию:)
Сначала определите уникальные (= нестандартные) атрибуты:
uniqueattrs <- setdiff(names(attributes(x)),c("names","row.names","class"))
И создайте матрицу, которая будет содержать имена и значения:
attribs <- matrix(0,0,2)
Прокручивать нестандартные атрибуты и сохранять в матрице имена и значения:
for (i in 1:length(uniqueattrs)) {
attribs <- rbind(attribs, c(uniqueattrs[i], attr(x,uniqueattrs[i])))
}
Преобразовать матрицу во фрейм данных и назвать столбцы:
attribs <- as.data.frame(attribs)
names(attribs) <- c('name', 'value')
И сохраните в любом формате, например .:
write.csv(attribs, 'foo.csv')
На ваш вопрос о метках переменных, проверьте функцию read.spss
из пакета foreign , так как она делает именно то, что вам нужно: сохраняет метки значений в разделе attrs. Основная идея заключается в том, что attr может быть фреймом данных или другим объектом, поэтому вам не нужно создавать уникальный «attr» для каждой переменной, а делать только один (например, с именем «varable label») и сохранять всю информацию там. , Вы можете вызвать как: attr(x, "variable.labels")['foo']
, где 'foo' обозначает требуемое имя переменной. Но проверьте функцию, упомянутую выше, а также атрибуты импортированных фреймов данных для более подробной информации.
Надеюсь, это поможет вам написать нужные функции намного лучше, чем я пытался описать выше! :)