Сворачивать столбцы фрейма данных в строку аккуратно - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть фрейм данных со столбцом, представляющим ответы тестового элемента (0 == неверно, 1 == правильно). Для анализа в другом (не R) программном обеспечении мне нужно преобразовать данные отклика элемента в строки. Полученные данные должны выглядеть следующим образом:

24 1111111111111111111111111110111111111111111111111111111111111111111111111111 50 1111111111111111111111111101111111111110111110111111111111111111111111111111 361 1111110111111111011011111110001111001011101110111111101111111101111101111111 349 1111111111111111111111111110111111110111111101111010011111110111111111111111

Я смог сделать это при чтении всего oop по одной строке данных за раз, например:

    for(i in 1:nrows) {
        text[i] <- paste(sprintf("%6d", subresp$study_id[i]), paste0(subresp[i, items], collapse=''))
    }

где items - строка символов, содержащая 70 имен столбцов, которые должны быть включены. Это выглядит следующим образом:

> head(items)
[1] "letter_sound1" "letter_sound2" "letter_sound3" "letter_sound4"
[5] "letter_sound5" "letter_sound6"
> 

(К сожалению, имена столбцов не все так часто называются, как в этом примере.)

Это работает, но это медленно и неуклюже (у меня есть сделать это для 12 уровней тестирования и 3 формы каждый), поэтому я хочу сделать это аккуратно. Я попробовал этот код:

  resp.str <- subresp %>%
        select(items) %>%
        rowwise() %>%
        mutate(resp.str=paste0(subresp[, items], collapse=""))

Это не работает, как ожидалось вообще. Вместо того, чтобы сворачивать ответы элемента в строку, он просто помещает все в строку.

 $ resp.str             : chr  "c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1"| __truncated__ "c(1, 1, 1, 1, 1, 1, 

Я пробовал quo(items) и !!items, {{items}}, sym(items) во всех различных комбинациях. Ничего не работает

Это очень расстраивает. Я был бы очень признателен за любую помощь.

В соответствии с запросом здесь является частью данных:

structure(list(study_id = c(24, 50, 361, 349, 296), step_name = c("STEP 3", 
"STEP 3", "STEP 3", "STEP 3", "STEP 3"), assessment_id = c(1888537, 
2533870, 2491616, 2266251, 2315116), color = c("Purple", "Purple", 
"Purple", "Purple", "Purple"), letter_sound1 = c(1, 1, 1, 1, 
1), letter_sound2 = c(1, 1, 1, 1, 1), letter_sound3 = c(1, 1, 
1, 1, 1), letter_sound4 = c(1, 1, 1, 1, 1), letter_sound5 = c(1, 
1, 1, 1, 1), letter_sound6 = c(1, 1, 1, 1, 1), letter_sound7 = c(1, 
1, 0, 1, 1), letter_sound8 = c(1, 1, 1, 1, 1), letter_sound9 = c(1, 
1, 1, 1, 1), letter_sound10 = c(1, 1, 1, 1, 1)), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("study_id", 
"step_name", "assessment_id", "color", "letter_sound1", "letter_sound2", 
"letter_sound3", "letter_sound4", "letter_sound5", "letter_sound6", 
"letter_sound7", "letter_sound8", "letter_sound9", "letter_sound10"
))

Если вы читаете структуру данных в фрейм данных с именем foobar, символьный вектор items можно получить: items <- names(foobar)[5:14]

1 Ответ

0 голосов
/ 01 февраля 2020

Без воспроизводимого примера трудно сказать, работает ли это, но вы можете попробовать что-то вроде:

apply(cars, 2, paste0, collapse="")

Объяснение:

apply(object, dimension, function, args_for_function)

Применить "paste0" с аргументами " collapse = "" "во втором измерении (столбцы) 'cars', вернуть список.

...