【问题标题】:mutate to transforma field of text into wrapped strings突变为将文本字段转换为包装字符串
【发布时间】:2021-07-10 20:30:15
【问题描述】:
adf <- data.frame(
      s = c('jfgjksdfg ikbhsjfkv jhdjkfvb kjhgjkhjbhk jhfjdf khkhk',
            'kjhgf kjhg hgdhjksmn',
            'cats dogs'),
      n = 1:3)

adf
                                                      s n
1 jfgjksdfg ikbhsjfkv jhdjkfvb kjhgjkhjbhk jhfjdf khkhk 1
2                                  kjhgf kjhg hgdhjksmn 2
3                                             cats dogs 3

我想将 s 中的 3 行文本中的每一行换行为 10 宽。试过了:

library(stringr)

    adf %>% mutate(blah = cat(str_wrap(s, width = 10), "\n")) %>% glimpse
    jfgjksdfg
    ikbhsjfkv
    jhdjkfvb
    kjhgjkhjbhk
    jhfjdf
    khkhk kjhgf kjhg
    hgdhjksmn cats dogs 
    Rows: 3
    Columns: 2
    $ s <chr> "jfgjksdfg ikbhsjfkv jhdjkfvb kjhgjkhjbhk jhfjdf khkhk", "kjhgf kjhg hgdhjksmn", "cats dogs"
    $ n <int> 1, 2, 3

不确定这是什么,但我期待一个新字段 blah,它只是在相同的 3 行上包装了 s 的文本版本。我该怎么做?

[编辑] 显示所需结果的屏幕截图。我不得不猜测电子表格上的 width=10 是什么样的

【问题讨论】:

  • 但是,如果你使用width = 10,它将用第一个单词本身完成
  • 对于最后一行,您将“猫”和“狗”一分为二,而在第一行和第二行,拆分的宽度不同。期望结果的逻辑不是很清楚

标签: r dplyr stringr


【解决方案1】:

我们可以将width 更改为更大的值,因为width = 10,将在's'的第一行中创建围绕第一个单词本身的环绕

substr(adf$s, 1, 10)
[1] "jfgjksdfg " "kjhgf kjhg" "cats dogs" 

根据?str_wrap

width - 以 字符 给出目标行宽的正整数。小于或等于 1 的宽度会将每个单词放在单独的一行中。

另外,cat 用于打印输出,没有return 值。我们可以去掉cat的包装,直接在DT::datatable中使用下面的代码

library(dplyr)
library(tidyr)
adf %>%
     mutate(s = str_wrap(s, width = 20))

【讨论】:

  • 嗨 Akrun,这会导致 df 有 9 行。期望的结果是相同的行数,只是每个单元格中显示的文本被换行。
  • 它最终会被传递给DT::datatable,这只是一个装饰性的东西
  • @DougFir 为什么不直接使用str_wrap 并保持这种状态。
  • 我正在测试,但是当他的输出由 DT::datatable() 显示时,完整的字符串出现在这种情况下,好像我根本没有包装它们:/
  • @DougFir 那只是因为我用cat包裹。如果你在DT上使用这个,你可以直接使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多