【发布时间】:2020-02-01 09:30:27
【问题描述】:
我有一个数据框,其中列是测试项目响应(0== 不正确,1== 正确)。为了在其他(非 R)软件中进行分析,我必须将项目响应数据转换为字符串。结果数据应如下所示:
24 1111111111111111111111111110111111111111111111111111111111111111111111111111
50 1111111111111111111111111101111111111110111110111111111111111111111111111111
361 1111110111111111011011111110001111001011101110111111101111111101111101111111
349 1111111111111111111111111110111111110111111101111010011111110111111111111111
我能够在一次读取一行数据的循环中执行此操作,如下所示:
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]
【问题讨论】:
-
使用
dput()添加您的数据。能够回答您的问题会有所帮助。 -
看看
stringr包中的str_c函数,它是tidyverse的一部分。 -
确实,您需要向我们提供
dput。仅从您的代码来看,您似乎可能在pmap之后,例如subresp %>% mutate(resp.str = pmap(list(subresp[, items]), paste, collapse = "")) -
根据要求,我已将部分数据包含在 OP 中。我尝试了
str_c,但它连接了列名,而不是具有这些名称的列的内容。我也尝试过pmap和apply,但它们给了我这个错误:Error: Columnresp.str` 的长度必须为 1(组大小),而不是 76`