R: Создать машиночитаемый вывод для сводки / описания

У меня есть фрейм данных с 10k строк и 500 столбцов. Для каждого столбца я хочу создать счетчик для каждого уникального значения в строке. Например

      Fruit    Vegetable  Meat 
1     Apple    Carrot     Steak
2     Apple    Potato     Chicken
3     Pear     Peas       Duck

Будет производить:

Fruit;Apple;2;Pear;1
Vegetable;Carrot;1;Potato;1;Peas;1
Meat;Steak;1;Chicken;1;Duck;1

Функция описания Hmisc производит такой анализ, но выходные данные настолько плохо отформатированы, что бесполезны.

Благодарю.

2 ответа

Решение
lapply(names(df),function(x){ tb <- table(df[[x]]);
      write.table(file="test.csv", append=TRUE, quote=FALSE, 
                  row.names=FALSE, col.names=FALSE, sep=";", 
                  x= paste(x, paste( names(tb), tb, collapse=";", sep=";") , 
                           sep=";") 
                  )})
#--------
fruit;Apple;2;Pear;1
veg;Carrot;1;Peas;1;Potato;1
meat;Chicken;1;Duck;1;Steak;1

Вы также увидите список из трех пустых значений, которые не будут отправлены в текстовый файл. Запись таблиц и матриц в файлы не является сильной стороной R. Существует write.matrix функция в пакете::MASS. Мои первые усилия с writeLines не удалось, потому что у него нет опции "добавить", и я не смог соединить вызов соединения, который бы append,

(Другая проблема в R заключается в том, что обработка списка (и наследование кадра данных) с помощью 'apply / lapply / sapply' не передает names элемента списка (и colnames для фреймов данных) в функцию, поэтому функции "записи" не будут иметь внутренних имен для записи в файл. Вот почему я работал с names(df) а не просто df,

В качестве дальнейшего примечания, вероятно, существуют функции написания JSON, и они могут быть более надежными. Я посмотрю и доложу.

Существует пакет RJSONIO:

> require(RJSONIO)
Loading required package: RJSONIO
> toJSON(df)
[1] "{\n \"fruit\": [ \"Apple\", \"Apple\", \"Pear\" ],\n\"veg\": [ \"Carrot\", \"Potato\", \"Peas\" ],\n\"meat\": [ \"Steak\", \"Chicken\", \"Duck\" ] \n}"

Вы могли бы запустить table функционировать через apply

Например

fruit <- c("Apple", "Apple", "Pear")
veg <- c("Carrot", "Potato", "Peas")
meat <- c("Steak", "Chicken", "Duck")
df <- data.frame(fruit, veg, meat)

apply(df, 2, table)

$fruit

Apple  Pear 
    2     1 

$veg

Carrot   Peas Potato 
     1      1      1 

$meat

Chicken    Duck   Steak 
      1       1       1
Другие вопросы по тегам