【问题标题】:Collapse columns of a data frame into a string tidily将数据框的列整齐地折叠成字符串
【发布时间】: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的数据框,则可以得到字符向量itemsitems &lt;- names(foobar)[5:14]

【问题讨论】:

  • 使用dput() 添加您的数据。能够回答您的问题会有所帮助。
  • 看看stringr包中的str_c函数,它是tidyverse的一部分。
  • 确实,您需要向我们提供dput。仅从您的代码来看,您似乎可能在pmap 之后,例如subresp %&gt;% mutate(resp.str = pmap(list(subresp[, items]), paste, collapse = ""))
  • 根据要求,我已将部分数据包含在 OP 中。我尝试了str_c,但它连接了列名,而不是具有这些名称的列的内容。我也尝试过pmapapply,但它们给了我这个错误:Error: Column resp.str` 的长度必须为 1(组大小),而不是 76`

标签: r dplyr tidyverse


【解决方案1】:

如果没有可重现的示例,很难判断这是否有效,但您可以尝试以下方式:

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

解释:

apply(object, dimension, function, args_for_function)

在 'cars' 的第二维(列)上应用带有参数 'collapse=""' 的 'paste0',返回一个列表。

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2020-12-14
    • 2021-07-12
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2010-10-19
    相关资源
    最近更新 更多