Преобразование двух столбцов с текстовыми переменными в фиктивные переменные с каждым словом текста, представляющим новый столбец - PullRequest
0 голосов
/ 27 сентября 2018

Для моей магистерской диссертации я анализирую курсы в университете.У меня 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

1 Ответ

0 голосов
/ 27 сентября 2018

Я создал несколько тестовых данных, потому что ваша ссылка была недоступна:

library(tidyverse)

testdata <-
  tribble(~coursename, ~description, ~outcomes,
          "Course1", "word1 word2 word3", "word7 word4 word5",
          "Course2", "word3 word4", "word6 word1 word7",
          "Course3", "word3 word1 word8 word9", "word2")

> testdata
# A tibble: 3 x 3
  coursename description             outcomes         
  <chr>      <chr>                   <chr>            
1 Course1    word1 word2 word3       word7 word4 word5
2 Course2    word3 word4             word6 word1 word7
3 Course3    word3 word1 word8 word9 word2     

Вы можете преобразовать данные с помощью dplyr в несколько шагов:

transformed_data <- 
  testdata %>% 

  ## split the strings into a list of words
  mutate_at(vars(description, outcomes), funs(strsplit(., " "))) %>% 

  ## in each row, concatenate the lists from description and outcomes
  rowwise() %>% 
  mutate(words_used = list(unique(c(description, outcomes)))) %>% 
  ungroup() %>% 

  ## the old variables are no longer needed
  select(-description, -outcomes) %>% 

  ## 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
# A tibble: 3 x 10
  coursename word1 word2 word3 word4 word5 word6 word7 word8 word9
  <chr>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Course1        1     1     1     1     1     0     1     0     0
2 Course2        1     0     1     1     0     1     1     0     0
3 Course3        1     1     1     0     0     0     0     1     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...