Разбить одну строку на несколько переменных с помощью R или SQLite - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть набор данных, который имеет четыре строковые переменные, соответствующие ответам кандидата на тест, например: " ECEABBBDACBBBADEEDCBBCBCEBAACABEABECCEADEADCE ".

Набор данных имеет четыре теста (четыре переменные ) с 45 ответами (45 - длина строки), и я wi sh, чтобы разбить каждую переменную на 45, всего 180 переменных.

У меня есть:

NU_INSCRICAO* | TX_RESPOSTAS_CN | TX_RESPOSTAS_CH | TX_RESPOSTAS_LC | TX_RESPOSTAS_MT

Я ожидаю :

NU_INSCRICAO* | Q1 | Q2 | ... | Q179 | Q180

* NU_INSCRICAO - это мой столбец идентификаторов

Ссылка на образец набора данных: https://pastebin.com/YK477UzW

My код:

for(i in 1:nrow(sample)) {
    for(j in 2:5) {
        for(k in 1:45) {
            answer <- substring(sample[i, j], k, k)
            correct <- substring(sample[i, j], k, k)

            if(answer == correct) {
                output*[i, (((j - 1) * k) + 1)] <- 1
            } else {
                output*[i, (((j - 1) * k) + 1)] <- 0
            }
        }
    }
}

* Структура кадра выходных данных была ранее создана с помощью NU_INSCRICAO, скопированной из набора данных образца

Я хочу узнать лучший способ сделать это .

Образец набора данных содержит 1000 строк, но мой реальный набор данных содержит более 3 миллионов, поэтому любые предложения об этом с помощью SQLite также помогут мне.

* Все * в этом посте только для иллюстрации, они не в реальном коде

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Из данных видно, что вас интересуют только первые 5 столбцов текстового файла. Мы можем прочитать данные в R и использовать cSplit из splitstackshape, чтобы получить данные из нескольких столбцов в отдельных столбцах.

dt <- read.table("sample.txt", sep = ";", header = TRUE)[1:5]
new_dt <- splitstackshape::cSplit(dt, names(dt)[-1], sep = "", stripWhite = FALSE)
0 голосов
/ 01 апреля 2020

Считать текстовый файл в R-фрейм данных dt:

dt <- read.table("sample.txt", sep = ";", header = T, stringsAsFactors = F)

Объединить столбцы от NU_INSCRICAO до TX_RESPOSTAS_MT, разбить его по символам и разбить на столбцы. Задать имя столбца

out <- data.frame(dt$NU_INSCRICAO, (do.call(rbind, strsplit(paste0(dt$TX_RESPOSTAS_CN, dt$TX_RESPOSTAS_CH, dt$TX_RESPOSTAS_LC, dt$TX_RESPOSTAS_MT),""))))
names(out) <- c("NU_INSCRICAO", paste0("Q", 1:185))

output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...