2015-10-05 1 views
0

Я хочу вывести несколько файлов PNG, и я не знаю, как их назвать. В основном я хочу сделать несколько облаков слов, используя один фрейм данных. Один столбец содержит данные, из которых должны быть сделаны слова облака, и один столбец содержит категории, для которых должны быть созданы облака слов. Я написал функцию для создания единого облака слов. Теперь я хочу, чтобы сохранить все слова облака на одном дыхании, используя tapply (или что-то еще), и каждое слово облако должно получить имя, как category_name.png Это воспроизводимая версия кода, который я написалдинамически присваивать имя фактора/строки внутри функции в R

library(tm) 
library(wordcloud) 

String_column = rep(c("hello round world", "beautiful round world", "good girls world", "unfair mean world", "hi girls hello","sad girls sorry"),6) 
Category_column = rep(c("Neutral", "Pos", "Pos", "Neg", "Neutral","Neg"),6) 

getCloudData <- function(StrCol,CatCol){ 
    answer_text <- paste(StrCol, collapse=" ") 
    answer_source = VectorSource(answer_text) 
    corpus = Corpus(answer_source) 
    dtmWords = DocumentTermMatrix(corpus) 
    matrixWords = as.matrix(dtmWords) 

    freqWords = colSums(matrixWords) 
    freqWords = sort(freqWords, decreasing = TRUE) 
    words <- names(freqWords) 
    png("C:\\Users\\GSinghal\\Downloads\\Text Mining\\catagory_xyz.png") 
    wordcloud(words[1:3], freqWords[1:3]) 
    dev.off() 
} 

getCloudData(String_column,Category_column) 
tapply(String_column, Category_column,getCloudData) 

сейчас когда я использую tapply Я хочу, чтобы все три файла были сохранены с именами Neutral.png, Pos.png и Neg.png. Фактические данные содержат около 11 000 строк и от 20 до 65 категорий.

+1

Я не уверен, что понимаю, что вы пытаетесь сделать, но я думаю, вам нужно переписать функцию, чтобы использовать одно значение из столбца категории, а затем запустить цикл 'for' для повторения этой функции уникальные значения 'Category_column'. Таким образом, вы получаете один сюжет за значение 'Category_column', каждый из которых использует все значения' String_column'. Правильно ли это звучит? – ulfelder

+0

Спасибо, ulfelder, я закончил тем, что написал код так, как вы предлагали. Спасибо –

ответ

1

Переписывая вашу функцию немного, и используя data.table вместо tapply может работать:

library(data.table) 

DT <- data.table(Cat_Col = Category_column, Str_Col = String_column) 

getCloudData <- function(StrCol,Category){ 
    answer_text <- paste(StrCol, collapse=" ") 
    answer_source = VectorSource(answer_text) 
    corpus = Corpus(answer_source) 
    dtmWords = DocumentTermMatrix(corpus) 
    matrixWords = as.matrix(dtmWords) 
    freqWords = colSums(matrixWords) 
    freqWords = sort(freqWords, decreasing = TRUE) 
    words <- names(freqWords) 
    png(paste(unique(Category),".png", sep = "")) #changed this part 
    wordcloud(words[1:3], freqWords[1:3]) 
    graphics.off() #instead of dev.off 
} 

DT[ , getCloudData(Str_Col,Cat_Col), by = "Cat_Col"] 

Это использует by функцию data.table, чтобы применить getCloudData функцию по всем категориям.

Затем вы должны увидеть все изображения в текущем рабочем каталоге.

+0

Спасибо Крису, хотя я реализовал решение с использованием цикла for, ваше решение выглядит лучше. Просто хотел узнать, передаем ли мы категорию в функции, почему нам нужно использовать уникальную (Категорию) в функции png. –

+1

@GauravSinghal Функция будет принимать столбец данных в качестве своего ввода для обоих аргументов. Поскольку R vecotrized, если мы просто используем 'png (paste (Category," .png ", sep =" ")),' он будет выводить 'Norm.png' столько раз, сколько строк для категории – Chris

 Смежные вопросы

  • Нет связанных вопросов^_^