Для моей магистерской диссертации я анализирую курсы в университете.У меня 1141 курс (в виде строк) с 4 переменными (в виде столбцов).Предварительный просмотр набора данных представлен ниже:
Предварительный набор данных
Набор данных можно загрузить здесь .
Вв столбцах Description и LearningOutcomes есть отфильтрованный (без стоп-слов, пунктуации и т. д.) текст.Каждое слово этого текста я хотел бы преобразовать в фиктивную переменную.Всего 10,493 независимых слова.Например, для одного экземпляра:
Предполагаемый вывод в качестве примера Excel
До сих пор я боролся с отдельной функцией Tidyr, однако я не получаю вывод отЭто.Кто-нибудь есть идея, чтобы решить эту проблему?
PS набор данных для преобразования находится в последней строке с именем «database2»
rm(list=ls());
#import database
database <- read_excel("/Volumes/GoogleDrive/My Drive/TU e Innovation Management /Thesis/testdatabasematrix.xlsx");
#name columns
colnames(database)[1] <- "Name";
colnames(database)[2] <- "Description";
colnames(database)[3] <- "LearningOutcomes";
# import packages
library(tidytext)
library(dplyr)
# here the text transformations for titles
title <- tibble(line = 1:nrow(database), text = database$Name) %>% # as tibble
unnest_tokens(word, text)%>% # remove punctuations, lowercase, put words in column
anti_join(stop_words, by = c("word" = "word")) %>% # remove stopwords
group_by(line) %>% summarise(title = paste(word,collapse =' ')) # now all in a row!
# here the text transformations for descriptions
description <- tibble(line = 1:nrow(database), text = database$Description) %>%
unnest_tokens(word, text) %>%
anti_join(stop_words, by = c("word" = "word")) %>%
group_by(line) %>% summarise(title = paste(word,collapse =' '))
# here the text transformations for learning outcomes
learningoutcomes <- tibble(line = 1:nrow(database), text = database$LearningOutcomes) %>%
unnest_tokens(word, text) %>%
anti_join(stop_words, by = c("word" = "word")) %>%
group_by(line) %>% summarise(title = paste(word,collapse =' '))
# now the full dataset
database2 <- title %>% left_join(description, by = 'line') %>% left_join(learningoutcomes, by = 'line')
colnames(database2) <- c("line","Name","Description","LearningOutcomes")
database2
# to do: stemming and remove numbers
#wordfreq_LearningOutcome <- data.frame(table(unlist(strsplit(tolower(database2$LearningOutcomes), " "))))
#wordfreq_Description <- data.frame(table(unlist(strsplit(tolower(database2$Description), " "))))
Код для AEF:
testdata <- database2
transformed_data <-
testdata %>%
## split the strings into a list of words
mutate_at(vars(Description, LearningOutcomes), funs(strsplit(., " "))) %>%
## in each row, concatenate the lists from description and outcomes
rowwise() %>%
mutate(words_used = list(unique(c(Description, LearningOutcomes)))) %>%
ungroup() %>%
## the old variables are no longer needed
select(-Description, -LearningOutcomes) %>%
## unnest the data to get a row for each course/word combination
unnest(words_used) %>%
## add a dummy variable that indicates that all combinations in the data are indeed present
mutate(present = 1) %>%
## use spread to convert from tall to wide format. Use 0 as filling for missing combinations
spread(words_used, present, fill=0)
transformed_data