Переменные Dynami c обновлены для For L oop в R - PullRequest
1 голос
/ 24 марта 2020

У меня есть вектор, который выглядит следующим образом:


FirstVector <- c("Dog Fox Funny" 
                  , "Dog Dolphin Angry"
                  , "Cat Catfish Bored"
                  , "Fish Clam Startled"
                  , "Lion Tiger Startled"
                  , "Cat Catfish Bored"
                  )

Мне нужно создать серию таблиц частот слов для каждых двух записей, которые выглядят так (в виде матриц данных):

Dataframe1

     angry dog dolphin fox funny
[1,]     0   1       0   1     1
[2,]     1   1       1   0     0

Dataframe2

     bored cat catfish clam fish startled
[1,]     1   1       1    0    0        0
[2,]     0   0       0    1    1        1

Dataframe3

     bored cat catfish lion startled tiger
[1,]     0   0       0    1        1     1
[2,]     1   1       1    0        0     0

Я могу создать таблицы, используя синтаксис ниже. Однако мне нужно сохранить их в виде матриц. Поэтому из синтаксиса мне нужно создать dataframe1, dataframe2 и dataframe3.

beginvar <- 1
endvar <- 2

SecondVector <- FirstVector[c(beginvar:endvar)]

for(i in 1:3) {

 df <- tibble(id = seq_along(SecondVector), text = SecondVector)
 a <- as.matrix.data.frame(table(unnest_tokens(df, word, text)))
 b <- colnames(table(unnest_tokens(df, word, text)))
 colnames(a) <- b 

 beginvar <- beginvar + 2
 endvar <- endvar + 2

}

* Мой фактический набор данных намного больше. Я разбиваю его на кусочки, чтобы в целях обработки *

1 Ответ

1 голос
/ 24 марта 2020

Мы можем создать SecondVector внутри l oop при инициализации list для хранения вывода

beginvar <- 1
endvar <- 2

lst1 <- vector('list', 3)


for(i in 1:3) {
  SecondVector <- FirstVector[c(beginvar:endvar)]
 df <- tibble(id = seq_along(SecondVector), text = SecondVector)
 a <- as.matrix.data.frame(table(unnest_tokens(df, word, text)))
 b <- colnames(table(unnest_tokens(df, word, text)))
 colnames(a) <- b
 lst1[[i]]  <- a

 beginvar <- beginvar + 2
 endvar <- endvar + 2

}

-output

lst1
#[[1]]
#     angry dog dolphin fox funny
#[1,]     0   1       0   1     1
#[2,]     1   1       1   0     0

#[[2]]
#     bored cat catfish clam fish startled
#[1,]     1   1       1    0    0        0
#[2,]     0   0       0    1    1        1

#[[3]]
#     bored cat catfish lion startled tiger
#[1,]     0   0       0    1        1     1
#[2,]     1   1       1    0        0     0

Или используйте while l oop

beginvar <- 1
endvar <- 2
lst1 <- list()
flag <- TRUE
i <- 1
while(flag){
    SecondVector <- FirstVector[c(beginvar:endvar)]
    df <- tibble(id = seq_along(SecondVector), text = SecondVector)
    a <- as.matrix.data.frame(table(unnest_tokens(df, word, text)))
    b <- colnames(table(unnest_tokens(df, word, text)))
    colnames(a) <- b
    lst1[[i]] <- a
    if(endvar >= length(FirstVector)){
     flag <- FALSE
    } else 
    beginvar <- beginvar + 2
    endvar <- endvar + 2

    i <- i + 1

    }

Если нам нужно создать несколько объектов в глобальном env

beginvar <- 1
endvar <- 2  
flag <- TRUE
i <- 1



while(flag){
       SecondVector <- FirstVector[c(beginvar:endvar)]
        df <- tibble(id = seq_along(SecondVector), text = SecondVector)
        a <- as.matrix.data.frame(table(unnest_tokens(df, word, text)))
        b <- colnames(table(unnest_tokens(df, word, text)))
        colnames(a) <- b
        assign(paste0('matrix', i),  a)
        if(endvar >= length(FirstVector)){
         flag <- FALSE
        } else 
        beginvar <- beginvar + 2
        endvar <- endvar + 2

        i <- i + 1

        }



matrix1
#     angry dog dolphin fox funny
#[1,]     0   1       0   1     1
#[2,]     1   1       1   0     0
matrix2
#     bored cat catfish clam fish startled
#[1,]     1   1       1    0    0        0
#[2,]     0   0       0    1    1        1
matrix3
#     bored cat catfish lion startled tiger
#[1,]     0   0       0    1        1     1
#[2,]     1   1       1    0        0     0
...