Создание R объектов из всех файлов в папке с помощью цикла for - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть куча повторяющегося кода, который, я думаю, я могу сделать более эффективным, включив цикл for; Хотя я пытался сделать из них объекты в R.

Папка с именем input содержит 10 файлов с названием «2010.txt, 2011.txt, ... 2019.txt»

L OOP ONE

files <- list.files("../input")

#Each Year File Path

y2010 <- read_file(glue("../input/", files[1], sep = ""))
y2011 <- read_file(glue("../input/", files[2], sep = ""))
...
y2019 <- read_file(glue("../input/", files[10], sep = ""))

Из этого я хотел бы сделать следующее:

##Dataframe of each year's data
all_text <- rbind(y2010,y2011,y2012,y2013,y2014,y2015,y2016,y2017,y2018,y2019)

L OOP TWO Теперь я хотел бы нравится брать каждый год и делать новые объекты "tok201x".

###Each year
tok2010 <- data_frame(text = y2010) %>%
  unnest_tokens(word, text)

tok2011 <- data_frame(text = y2011) %>%
  unnest_tokens(word, text)

...

tok2019 <- data_frame(text = y2019) %>%
  unnest_tokens(word, text)

L OOP THREE Наконец, возьмите "tok201x" и введите их в код настроения.


#2010
nrc2010 <- tok2010 %>%
  inner_join(get_sentiments("nrc")) %>% # pull out only sentiment words
  count(sentiment) %>% # count each 
  spread(sentiment, n, fill = 0)# made data wide rather than narrow

#2011
nrc2011 <- tok2011 %>%
  inner_join(get_sentiments("nrc")) %>% # pull out only sentiment words
  count(sentiment) %>% # count each 
  spread(sentiment, n, fill = 0)# made data wide rather than narrow

...

#2019
nrc2019 <- tok2019 %>%
  inner_join(get_sentiments("nrc")) %>% # pull out only sentiment words
  count(sentiment) %>% # count each 
  spread(sentiment, n, fill = 0)# made data wide rather than narrow

И все они хранятся в списке.

Я играл с assign () , но это не сработало так, как я надеялся.

РЕДАКТИРОВАТЬ: Используя код @ desval с lapply (), я сломал функцию. Цель этого состоит в том, чтобы объединить списки в один df. Как мне выполнить sh это, хотя?

custom.function1 <- function(x){
  #debug x <- files[1]
  tmp <- read_file(x)
  tmp <- tibble(text = tmp)
return(tmp)
}

custom.function2 <- function(x){
tmp <- tmp %>%
  unnest_tokens(word, text) %>%
  inner_join(get_sentiments("nrc")) %>% # pull out only sentiment words
  count(sentiment) %>% # count each 
  spread(sentiment, n, fill = 0)
return(tmp)
}

out1 <- lapply(files, function1)

##Take all year data and combine into one dataframe, previously...
outYEAR <- matrix(unlist(out1), ncol = 10, byrow = TRUE)
outYEAR <- outYEAR %>% 
    pivot_longer(everything(), names_to = 'year', values_to = 'text') 
##This does not work....

out2 <- lapply(out1, function2)

##Again, combine to one dataframe, previously...
out2YEAR <- matrix(unlist(out2), ncol = 10, byrow = TRUE)
out2YEAR <- out2YEAR %>% 
    pivot_longer(everything(), names_to = 'year', values_to = 'text') 
#THIS DOES NOT WORK.

Коллективный df должен быть "матрицей", а не "tbl_df".

1 Ответ

2 голосов
/ 17 апреля 2020

Я думаю, вам лучше использовать lapply. Я не уверен, почему необходимо читать все файлы, привязывать их, а затем снова разделять. Если это не так, то что-то в этом роде может сработать:

 library(janeaustenr)
library(tidytext)
library(textdata)
library(tidyverse)
library(data.table)

# some generated data in your directory
d <-  tibble(txt = prideprejudice[1:10])
writeLines(d$txt, "2010.txt")
writeLines(d$txt, "2011.txt")

# list of files
files <- list.files(pattern = "\\d{4}")

custom.function1 <- function(x){
  tmp <- read_file(x)
  tmp <- tibble(text = tmp)
  return(tmp)
}
out1 <- lapply(files, custom.function1)


custom.function2 <- function(x){
  tmp <- x %>% unnest_tokens(word, text) %>%
    inner_join(get_sentiments("nrc")) %>% # pull out only sentiment words
    count(sentiment) %>% # count each 
    spread(sentiment, n, fill = 0)
  tmp <- setDT
  return(tmp)
}
out2 <- lapply(out1, custom.function2)

Теперь связывайте их по строкам (возможно, без data.table, но это очень удобно):

out1_all <- out1
out1_all <- lapply(out1_all, setDT) %>% rbindlist(. , id="id_var")

out2_all <- out2
out2_all <- lapply(out2_all, setDT) %>% rbindlist(. , id="id_var")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...